題目:
給定乙個字串,求出其最長的重複子串(最長重複子串可以重疊)。
如字串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...