求字串最長的重複子串

2021-09-01 19:47:11 字數 1596 閱讀 3353

題目:

給定乙個字串,求出其最長的重複子串(最長重複子串可以重疊)。

如字串abcdabcabcd,其最長的重複子串為abcd;

如字串abcdabcda,其最長的重複子串為abcda。

演算法思想:

對字串生成相應的字尾陣列,再對其排序,排序後依次檢測相鄰兩個字串的公共字首,時間複雜度為o(n^2*logn)。

程式如下:

#include

using namespace std;

#define max 256

/* 定義全域性變數 */

char str[max];

char *suffix_array[max];// 對於長度為n的字串,其字尾陣列的長度亦為n(存放n個字尾字串)

/* 初始化字串與其字尾陣列 */

void suffix(char *str, char **suffix_array)

str[i] = '\0';

}/* 氣泡排序 */

void bubblesort(char **suffix_array, int n)

/* 快速排序 */

void quicksort(char **suffix_array, int left, int right)

/* 返回兩個字串公共字首的最大長度 */

int complen(char *str1, char *str2)

return len;

}/* 由排序後的字尾陣列,求得最長的重複子串的長度 */

char* assignstrwithmaxlen(char *dest, char **sorted_suffix_array, int n)

}strncpy(dest, sorted_suffix_array[beginindex], max);

return dest;

}int main()

;assignstrwithmaxlen(dest, suffix_array, n);

cout << dest << endl;

return 0;

}

複習排序演算法:

/* 氣泡排序 */

void bubblesort(char **suffix_array, int n)

}if (flag == 1)}}

/* 快速排序 */

void quicksort(char **suffix_array, int left, int right)

if (i < j)

while (i < j && strcmp(suffix_array[i], pivot) <= 0)

if (i < j)

}suffix_array[i] = pivot;// 此時i=j

quicksort(suffix_array, left, i - 1);

quicksort(suffix_array, i + 1, right);}}

void swap(char *&ptr1, char *&ptr2)

字串 最長重複子串

乙個長度為10000的字串,寫乙個演算法,找出最長的重複子串,如abczzacbca,結果是bc trie 樹典型應用。字尾樹 package leetcode 乙個長度為10000的字串,寫乙個演算法,找出最長的重複子串,如abczzacbca,結果是bc public class longest...

求最長重複子串

主要思路還是求出所有的字尾陣列,對字尾陣列進行排序,這樣所有最接近的字串一定就在相鄰了,只需要比較每個字尾陣列的前後兩個串,就可以求出所有重複的字串,然後比較就可以得到最大的重複串的長度。include include include include include using namespace ...

求字串中的最長不重複子串

題目描述 給定一字串只包含數字,請寫乙個演算法,找出該字串中的最長不重複子串 不重複是指子串中每一元素不同於子串中其他元素 如 120135435 最長不重複子串為 201354 實現如下 時間複雜度o n 空間複雜度o m class solution void maxnonrepetitives...