KMP
来源:互联网 发布:windows哪个版本最好 编辑:程序博客网 时间:2024/05/29 05:06
思路不说了,也不分析了,自己看数据结构的书p80~p84
这里贴下代码就是了,另外推荐学习这节内容的一些好资料
严蔚敏求next视频
这个有点多,可以说是比较啰嗦,但是很详细,讲了有好久
这个是这个算法的演示
还有类似的相关代码的实现,全部在我的资源里面
下面的是求next的代码
void get_next(char *t){int j=1,k=0;next[1]=0;while (j<=t[0]){ if (k==0||t[j]==t[k]){++j,++k;next[j]=k;}else{k=next[k];}}}
但是这个还没有完全优化,就是 模式串有字符重复的时候例如:
主串s:aaabaaaab
模式串:aaaab
在这里 由于模式串前面的相同,程序在运行到i=4时,可以直接跳过后面四个a,就是这里做了一点优化
下面是优化后的代码
void get_nextval(char *t){ int i=1; nextval[1]=0; int j=0; while (i<t[0]) { if (j==0||t[i]==t[j]) { ++i; ++j; if (t[i]!=t[j]) nextval[i]=j; else nextval[i]=nextval[j]; } else { j=nextval[j]; } }}
最后是整个程序的代码:
#include <iostream>using namespace std;#include <string.h>int *nextval=new int[1005];int Run(char *s,char *t,int pos){int i=pos,j=0;while (i<=s[0]&&j<=t[0]){if (j==0||s[i]==t[j])//{++i,++j;}else{j=nextval[j];}}if (j>t[0])return i-t[0];elsereturn 0;}void get_nextval(char *t){ int i=1; nextval[1]=0; int j=0; while (i<t[0]) { if (j==0||t[i]==t[j]) { ++i; ++j; if (t[i]!=t[j]) nextval[i]=j; else nextval[i]=nextval[j]; } else { j=nextval[j]; } }}int main(){char s[1002],t[1002];while (cin>>s>>t){int i=0,len1=strlen(s),len2=strlen(t);for (i=len1; i>=0; i--)s[i+1]=s[i];s[0]=len1;for (i=len2; i>=0; i--)t[i+1]=t[i];t[0]=len2;get_nextval(t);cout<<"出现的位置是:"<<Run(s,t,0)<<endl;/*for (i=Run(s,t,1); len2--; i++)cout<<s[i];cout<<endl;*/}delete []nextval;return 0;}
- KMP
- KMP
- KMP
- KMP
- KMP
- KMP
- kmp
- kmp
- KMP
- kmp
- KMP
- KMP
- KMP
- kmp
- KMP
- KMP
- kmp
- KMP
- smarty内建函数
- 片段代码
- 2011-11-17日志
- Android应用开发笔记——打造自己的标签栏
- DP入门,HDU 2084 数塔 参考代码
- KMP
- 部分面试题解题思路
- java.io(一)
- 子线程在后台运行: performSelectorInBackground
- 关于delete一个派生类时调用基类定义的virtual destructor的问题
- 提取某日访问次数最多的那个IP
- java.io.FileOutputStream
- Codeforces Beta Round #93
- 关系数据库之父-埃德加·考特