数据结构实验之串一:KMP简单应用
2016-08-23 13:58
190 查看
这道题的关键在于回溯 j 值的时候,如何避免不必要的回溯,kmp算法就是求得一个next数组, 这个数组就是用来计算 j 的回溯值。
代码如下:
#include <stdio.h>
#include <string.h>
int next[1000001];
char s1[1000001],s2[1000001];
void get_next(int len){
int i,j;
i=0;
j=-1;
next[0]=-1;
while(i<len){
if(j==-1||s2[i]==s2[j]){/*s2[i]表示前缀字符,s2[j]表示后缀字符*/
++i;
++j;
if(s2[i]!=s2[j])//若当前字符与前缀字符不同,
next[i]=j;//则当前的j为next在i位置的值;
else
next[i]=next[j];//如果与当前字符相同,则将前缀字符的next值赋给next在i位置的值;
//next[i]=j;
}
else
j=next[j];//若字符不相同,则j值回溯;
}
}
int main(){
int n,m,i,j;
while(scanf("%s %s",s1,s2)!=EOF){
n=strlen(s1);
m=strlen(s2);
get_next(m-1);//求next数组;
i=0;
j=0;
while(i<n&&j<m){
if(j==-1||s1[i]==s2[j]){
i++;
j++;
}
else{
j=next[j];//j退回到合适的位置,i值不变;
}
}
if(j>=m)
printf("%d\n",i-j+1);
else
printf("-1\n");
}
return 0;
}
相关文章推荐
- 第4章第1节练习题11 查找最近公共祖先节点
- nginx-nginx数据结构
- 数据结构实验之排序四:寻找大富翁
- SDUT OJ 3398 数据结构实验之排序一:一趟快排
- SDUT OJ 3401 数据结构实验之排序四:寻找大富翁
- Linux 内核里的数据结构——位数组
- OJ3403数据结构实验之排序六:希尔排序
- OJ3404数据结构实验之排序七:选课名单
- OJ3401数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序七:选课名单
- 数据结构实验之排序六:希尔排序
- 数据结构之单调栈单调队列模板
- 《数据结构与算法》学习笔记19 递归_二分查找
- 数据结构实验之排序四:寻找大富翁(堆排序)
- 二叉树总结
- java--数据结构--8种排序算法
- 数据结构实验之排序五:归并求逆序数
- 数据结构实验之数组三:快速转置
- 【1】TypedArray.mData 研究
- 全数据结构