求一個字串的最長重複字串問題
給定一個字串,求出這個字串的最長重複字串,例如abcdbcd,最長重複字串是bcd。
分析:
方法1:
具體過程如下:
1)首先解決兩個字串的最長公共鄰接子串問題;
2)將字串,abcdbcd分成如下兩個字串的集合:
“a" 和 "bcdbcd"
"ab"和“cdbcd"
"abc"和"dbcd"
"abcd"和"bcd"-->產生最大子串bcd
“abcdb"和"cd"
"abcdbc"和"d"
完畢。
演算法的複雜度是O(n^3)
方法2:
通過後綴樹來計算,迴圈將字串拆分成:
abcdbcd
bcdbcd
cdbcd
dbcd
bcd
cd
d
構建一棵字尾樹如下:
a-b-c-d-b-c-d
b-c-d-b-c-d
c-d-b-c-d
d
對於字串bcd、cd等已經出現在後綴樹中的字串,計算路徑最長的一個字串,就是最長字串。
演算法複雜度為O(n)
其實這個問題來源於web search spam中spamer在標題、anchor中堆砌重複關鍵詞的問題。
參考文獻:
相關推薦
求一個字串的最長重複字串問題
給定一個字串,求出這個字串的最長重複字串,例如abcdbcd,最長重複字串是bcd。 分析: 方法1: 具體過程如下: 1)首先解決兩個字串的最長公共鄰接子串問題; 2)將字串,abcdbcd分成如下兩個字串的集合: “a" 和 "bcdbcd" "ab"和“cdbcd"
給定一個字串,求出其最長的重複子串的長度
題目來源:這是程式設計珠璣上的一道題目 概念 字串的字首和字尾 例如字串 s =“abcdeabc” 則s的字首: “a”,“ab”,“abc”,“abcd”,“abcde”,“abcdea”,“abcdeab”,“abcdeabc”其中除了s
給定一個字串,求出其最長的重複子串
題目:給定一個字串,求出其最長的重複子串 如字串abcdabcabcd,求的最長重複子串為abcd 程式碼: void LongChar(char* str) { if(str==NULL) return; int max=0; &
【每日面試題】給定一個字串,求出其最長的重複子串
題目:給定一個字串,求出其最長的重複子串 如字串abcdabcabcd,求的最長重複子串為abcd 程式碼: void LongChar(char* str) { if(str==NULL) return; int max=0; int first=0; int
求一個字串當中的最長重複子串
#include<stdio.h> #include<string.h> /* 最長重複子串 Longest Repeat Substring */ int maxlen; /* 記錄最長重複子串長度 */ int maxindex;
求字串的最長重複子串
int pstrcmp(const void* p,const void* q) { //qsort要用到,按字典序對子字串排序 return strcmp(*(char**)p,*(char**)q); } int comlen(char* p,char* q) {
求字串的最長重複子串(java)
-暴力法 兩個指標實現,複雜度O(n^2) package test; import java.util.Scanner; public class Main2 { public static String maxRepat(String str)
尋找一個字串中的最長重複子串(字尾陣列)&找出一個字串中最長不重複子串
一、尋找一個字串中的最長重複子串(字尾陣列) 字尾陣列其實可以看尋找一個字串中的最長重複子串(字尾陣列)作一個由字串s倒數i個字元組成的子串的集合,其中0<i<s.length(),例如 字串strstr的字尾陣列為: {r,tr,str,rstr,trstr,
求給定字串中最長重複子串
問題描述: 給定一個字串,如abcdaaabbbaaaabcdbbb,這個串中最長重複子串為abcd;若有多個長度相等的重複子串,只需輸入第一個最長的。 最直觀的演算法設計: 設給定的字串為s=“a1a2a3...an”,則對任意ai,在i+1到n之間查詢aj, s.t.
求字串的最長重複子串——Java實現
要求:求一個字串的最長重複子串 思路:使用兩個指標,兩個指標的間隔從1,2,3...依次增大, 同時向右移動兩個指標,在移動的過程中判斷指標位置的字元是否相同,並記錄最長子串的長度。 Java程式碼: public class Solution { // 求解字串中的
一個字串A的子串被定義成從A中順次選出若干個字元構成的串。如A=“cdaad" ,順次選1,3,5個字元就構成子串" cad" ,現給定兩個字串,求它們的最長共公子串。 小王對既是素數又是迴文的
一個字串A的子串被定義成從A中順次選出若干個字元構成的串。如A=“cdaad" ,順次選1,3,5個字元就構成子串" cad" ,現給定兩個字串,求它們的最長共公子串。 小王對既是素數又是迴文的數特
字串處理演算法(六)求2個字串最長公共部分
基礎演算法連結快速通道,不斷更新中: 整型陣列處理演算法部分: 整型陣列處理演算法(一)按照正態分佈來排列整型陣列元素 整型陣列處理演算法(二)檔案中有一組整數,要求排序後輸出到另一個檔案中 整型陣列處理演算法(三)把一個數組裡的所有元素,插入到另一個數組的指定位置 整型陣列
演算法 -- 求最長公共字串&PHP
本文是利用PHP,求最長公共字串。 思路:利用動態規劃和矩陣的思想。 動態規劃:就是用空間的代價來爭取時間,將中間結果儲存下來,後面迴圈使用供,減少重複計算次數。 矩陣思想:定義一個矩陣,寬和高分別為兩個字串的長度。從上到下、從左到右逐個掃描,每次掃描要比較矩陣中每個點對應的行列字元
找出字串最長不重複子串(或者是列表)
# 找出來一個字串中最長不重複子串def find_Maxlen_Son_list(astr): maxlen = 0 定義最長字串的初始長度// dict = {} list1 = [] for i in range(0,len(astr)): str2 = ''
資料結構——求一個串中出現的第一個最長重複子串
求一個串中出現的第一個最長重複子串。 輸入串:36123459836121234569 求最長重複子串: 原串:36123459836121234569 最長重複子串:12345 關於這個問題有KMP優化,暫時還沒掌握 下面這個演算法在輸入輸出方面還有待優化 #include <
《程式設計師程式碼面試指南》求兩個字串最長公共子串
/** * 題目: * 給定兩個字串 str1 和 str2,返回兩個字串的最長公共子串。 *舉例: * str1 = "1AB2345CD",str2 = "12345EF",返回"2345"。 */ /** * 解答: * 經典動態規劃的方法可以做到時間複
演算法 -- 求最長公共字串&PHP
本文是利用PHP,求最長公共字串。 思路:利用矩陣的思想,如兩個字串:“abcd”和“ebc”。 定義一個矩陣,寬和高分別為兩個字串的長度。從上到下、從左到右逐個掃描,每次掃描要比較矩陣中每個點對應
找出字串的最長重複子串
一個長度為10000的字串,寫一個演算法,找出最長的重複子串,如abczzacbca,結果是bc。 提示:此題是字尾樹/陣列的典型應用,即是求字尾陣列的height[]的最大值。 #include
尋找字串最長不重複的子串
例子:1、字串“abcabcbb”,最長子串是“abc”,長度是3; 2、字串“bbbb”,最長子串是“b”,長度是1; 3、字串“pwwkew”,最長子串是“wek”,長度是3; 程式是: var lengthOfLongest = function (s)
字串的最長重複子串
#if 1 #include <iostream> #include <stdlib.h> using namespace std; int pstrcmp(const