概述
KMP算法应用
题目描述:
给定一个字符串,求其中出现重复的任意一个字符?再求其中最长的重复子串?
题目分析:
如果明白KMP原理,明白next数组next[j]=k的具体含义,这样的题目可以用next数组来求解。next[j]=k,表示在模式串p中第j个字符前有长度为k的相同前缀和后缀。相同的前缀和后缀就是重复子串。
1. 求其中出现重复的任意一个字符
思路1:
先求next数组,next[j]=k,k > 0 时,就返回j,p[j]就是出现重复的字符。
class Solution {
public:
int position(char p[], int *next) {
int i, j, res;
int len = strlen(p);
i = 0;
j = -1;
res = -1;
/* 初始化很重要 */
next[0] = -1;
/* get every next[i] */
while (i < len) {
if (-1 == j || p[i] == p[j]) {
++ i;
++ j;
next[i] = j;
/* we get it */
if (j > 0) {
return i;
}
} else {
j = next[j];
}
}
return res;
}
char *find_one(char *p) {
int i, j, pos;
int len = strlen(p);
int *next = new int[len];
for (i = 0; i < len - 1; i ++) {
pos = position(p + i, next);
if (pos != -1)
break;
}
/* 返回p[i]的地址也可以,出现重复的字符是前缀==后缀 */
// return &p[i];
return &p[i + pos - 1];
}
};
2. 求最长的重复子串
思路2:
求最长的重复子串,就是求next[j]=k,求出k的最大值。
class Solution {
public:
int position(char p[], int *next) {
int i, j, res, max;
int len = strlen(p);
i = 0;
j = -1;
res = -1;
max = 0;
next[0] = -1;
/* get every next[i] */
while (i < len) {
if (-1 == j || p[i] == p[j]) {
++ i;
++ j;
next[i] = j;
/* we get it */
if (j > max) {
max = j;
}
} else {
j = next[j];
}
}
return max;
}
char *longest(char *p) {
int i, j, max, res, start;
int len = strlen(p);
int *next = new int[len];
max = 0;
start = 0;
for (i = 0; i < len - 1; i ++) {
res = position(p + i, next);
/* 如果是最大值,保存max和起始start */
if (res > max) {
max = res;
start = i;
}
}
char *temp = (char *)malloc(max);
memcpy(temp, &p[start], max);
return temp;
}
};
最后
以上就是阔达抽屉为你收集整理的KMP算法应用KMP算法应用的全部内容,希望文章能够帮你解决KMP算法应用KMP算法应用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复