字串中的最長重複字串

2021-04-24 20:16:24 字數 2352 閱讀 7637

/* 求乙個字串中的最長重複字串 基本思路是利用next陣列來實現

next陣列的定義 就是 字串中第j個字元 必有next[j] - 1個重複

字串, 事實上 kmp查詢  求模式串next陣列  就是指求出模式串j個

字元前 最大的重複子串

#include

#include

#include

#include

#define __in

#define __out

#define __in__out

#define __debug__xu

typedef struct __max_sub

int start;

int len;

int tempstart;

int templen;

}max_sub, *pmax_sub;

int getnext(__out int *next, __in char *substring);

int main(int argc, char **argv)

char *string = "ccccabababab";

char *substring;

unsigned int len, sublen;

int *next;

int i;

int flag = 0;

#ifdef __debug__xu

int j;

#endif

max_sub maxsub = ;

len = strlen(string);

for(i = 1; i < len; i++)

if(string[i] != string[0])

flag = 1;

break;

if(!flag)

printf("string has only one sort of char/n");

printf("%s", string);

return 0;

for(i = 0; i < len; i++)

#ifdef __debug__xu

printf("substring first pos: %d/n", i);

#endif

substring = string + i;

sublen = strlen(substring);

next = (int *)malloc(sizeof(int) * (sublen + 1));

maxsub.templen = getnext(next, substring);

maxsub.tempstart = i;

if(maxsub.templen > maxsub.len)

maxsub.len = maxsub.templen;

maxsub.start = maxsub.tempstart;

#ifdef __debug__xu

for(j = maxsub.start; j < maxsub.len + maxsub.start; j++)

printf("%c", string[j]);

printf("/n");

#endif 

free(next);

int getnext(__out int *next, __in char *substring)

char *string;

int k, i;

int max_k;

string = substring;

next[0] = -1;

k = next[0];

i = 0;

max_k = k;

while(i < strlen(substring))

if(i + 1 == strlen(substring) )

if(substring[k] == substring[i])

goto kmp;

if(-1 == k || substring[k] == substring[i])

kmp:

i++;

k++;

next[i] = k;

if (k > max_k)

max_k = k;

else

k = next[k];

#ifdef __debug__xu

for(i = 0; i < strlen(substring) + 1; i++)

printf("next[%d] = %d  ", i, next[i]);

printf("/n");

getchar();

#endif

return max_k;

無重複字串的最長字串

無重複字元的最長子串 難度中等 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3...

最長不含重複字串的子字串

一 題目描述 請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含 a a z z 的字元。例如,在字串 arabcacfr arabcacfr 中,最長的不含重複字元的子字串是 rabc rabc 或者 acfr acfr 長度為4.二 解題思路 1.採用動態規...

求字串中重複出現的最長字串

求字串中重複出現的最長字串 例如字串 drgabcifrabcsdrrs中,最長公共字串是 abc 方法 利用字尾樹來求。字串的字尾樹有如下 drgabcifrabcsdrrs rgabcifrabcsdrrs gabcifrabcsdrrs abcifrabcsdrrs s1 rabcsdrrs ...