最長可重疊的重複子串(2)

2021-06-09 23:39:15 字數 2396 閱讀 9394

勇幸|thinking (

---首先這是乙個單字串問題。子字串r 在字串l 中至少出現兩次,則稱r 是l 的重複子串。重複子串又分為可重疊重複子串和不可重疊重複子串,這裡只是簡單討論最長可重疊的重複子串,給出基本演算法和基於字尾陣列的演算法;關於字尾陣列,這裡也只是用最簡單的形式實現,對於字尾陣列的倍增演算法和dc3演算法的實現以及不可重疊重複子串的問題可參見演算法合集之《字尾陣列——處理字串的有力工具》,以後再整理這幾個問題。

最直接的方法就是子串和子串間相互比較,這樣檢視所有的子串對,時間複雜度為o(n^2),**如下:

/* 最長重複子串 longest repeat substring */

int maxlen;    /* 記錄最長重複子串長度 */

int maxindex;  /* 記錄最長重複子串的起始位置 */

void outputlrs(char * arr); /* 輸出lrs */

/* 最長重複子串 基本演算法 */

int comlen(char * p, char * q)

return len;

}

void lrs_base(char * arr, int size)

}

}

outputlrs(arr);

}

第二種方法便是採用《

程式設計珠璣

suff[0]:banana

suff[1]:anana

suff[2]:nana

suff[3]:ana

suff[4]: na

suff[5]: a

如果某個子串在目標字串中出現兩次,那麼它必將出現在兩個不同的字尾中,因此對字尾陣列進行排序,以尋找相同的字尾,然後掃瞄陣列,比較相鄰的元素便可以找出最長的重複子串。**如下:

/* 最長重複子串 字尾陣列 */

char * suff[30];

int pstrcmp(const void * p, const void * q)

void lrs_suffix(char * arr, int size)

qsort(suff, size, sizeof(char *), pstrcmp); /* 排序字尾 */

for(int i = 0; i < size-1; ++i)  /* 尋找最長重複子串 */

}

outputlrs(suff[suff_index]);

}

最後給出輸出程式和測試用例:

/* 輸出lrs

* 在字尾陣列方法中,maxindex=0

* 因為傳進來的就是字尾陣列suff,從0列印maxlen個字元

*/

void outputlrs(char * arr)

printf("the len of lrs is %d\n",maxlen);

int i = maxindex;

while(maxlen--)

printf("\n");

}

void main()

(全文完)

最長可重疊的重複子串

題目大意 給定乙個字串,求它的最長可重疊的重複子串的長度 思路 求出height陣列之後,輸出最大值即可。因為最長可重疊的重複子串一定是在相鄰兩個字尾的最長公共字首,即height,而要求最大值,輸出height最大值即可 include include define max a,b a b?a b...

求最長可重疊重複子串

問題描述 給定乙個字串,求出其可重疊最長重複子串 例如 abcdabcd 最長重複子串是 abcd,最長重複子串可以重疊 例如 abcdabcda,這時最長重複子串是 abcda,中間的 a 是被重疊的。直觀的解法是,首先檢測長度為 n 1 的字串情況,如果不存在重複則檢測 n 2,一直遞減下去,直...

最長重複子串(可重疊) 字尾陣列

找了半天終於找到乙個可以提交的地方。題解 任何乙個重複子串,都必然是某兩個字尾的最長公共字首。因為,兩個字尾的公共字首,它出現在這兩個字尾中,並且起始位置時不同的,所以這個公共字首必然重複出現兩次以上 可重疊 而任何兩個字尾的最長公共字首為某一段height值中的最小值,所以最大為height值中的...