字符串中的最长重复字串
2009-02-21 15:17
218 查看
/* 求一个字符串中的最长重复字串 基本思路是利用next数组来实现
next数组的定义 就是 字符串中第J个字符 必有next[J] - 1个重复
字串, 事实上 KMP查找 求模式串next数组 就是指求出模式串J个
字符前 最大的重复子串
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#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 = {0};
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;
}
next数组的定义 就是 字符串中第J个字符 必有next[J] - 1个重复
字串, 事实上 KMP查找 求模式串next数组 就是指求出模式串J个
字符前 最大的重复子串
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#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 = {0};
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;
}
相关文章推荐
- 字符串中选择最长无重复字串问题
- 重复子串问题(四):求两个字符串的最长公共字串
- 求字符串中重复出现的最长字串
- 【算法剖析】求字符串中无重复字符的最长字串
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
- 返回一个字符串中重复出现的最长字串的长度及其开始字符
- 字符串中重复出现的最长字串-后缀树思想
- 通过后缀数组求字符串中最长重复字串
- 求字符串最长连续不重复的字串
- 最长重复字串和两字符串中最长公子子串问题
- 写一个函数,用来把一个字符串用指定的字符作为分隔符分割成若干个子串输出 | 写一个函数,用来返回一个字符串中重复出现的最长字串的长度及其开始地址
- 求字符串的最长不重复字串
- 实现用后缀数组求字符串的最长重复字串
- 网上有些例子有问题,所以重新写了下 求字符串的最长不重复字串
- 【算法剖析】求字符串中无重复字符的最长字串
- 利用后缀数组求字符串的最长重复子串的算法 利用二维数组求两个字符串的最长公共字串(动态规划)
- 用后缀数组 求一个字符串的最长重复字串
- 编程珠玑(二)寻找一个字符串中最长重复字串