主要还是KMP算法,上学期没学,只是考前抱了抱佛脚,也没怎么弄明白.
先放代码:

//KMP
#include <bits/stdc++.h>//万能头
using namespace std;
string s,t;//s文本串,t模式串
//用char数组比较符合习惯,但是想试试string类
int nxt[100002];//在全局变量区,一般这个数组会初始化为全0
//getNext函数实际上就是让t自己与自己进行一个匹配.
void getNext(string& t)//一开始用的string* t,但好像不可以?
{
nxt[0]=-1;
int k=-1,j=0;
while(j<t.length())//最初写的t.length()-1,答案不对,见main中的解释
{
if(k==-1||t[k]==t[j])//匹配成功,往后继续
{
j++;k++;
//先++再给nxt数组赋值,因为我是按这个位置之前的字符串(不包括当前位置)的最长前后缀长度为此位置的nxt值
nxt[j]=k;
}
else k=nxt[k];
//意思是如果串的前后缀匹配到这里开始不等了,就寻找前面串里是否还有更小的前后缀(后面会图解)
}
} int KMP(string& s,string& t)//同样不知道为什么得用&引用才不报错
{
int ls = s.length(),lt = t.length();
int i=-1,j=-1;
while(i<ls)
{
if(s[i]==t[j]||j==-1)
{
i++; j++;
}
else j = nxt[j];//匹配不上就把t串右移
if(j==lt)//t被全部匹配上了
{
printf ("%d\n",i-lt+1);
j = nxt[j];//继续找下一个匹配上的位置
}
}
if(j<lt) return -1;//最后没匹配上就返回-1
}
int main()
{
cin>>s>>t;//太久不打,最初串流符号都打返了
getNext(t);
KMP(s,t);
for(int i=1;i<=t.length();i++) printf("%d ",nxt[i]);
//最后一行输出border,似乎是nxt,但又不真的是nxt
//因为我的nxt其实求的是上一位的border...
//所以从1号下标开始输出,这时候最后那个border会出现缺失(为0)情况
//因为根本没算它,就是初始值.所以我在求nxt的时候又多求了一位
//也就出现了getNxt函数中的t.length()没有减1...
}

我的理解:
①求nxt值时,刚开始很明显是要找到和开头一样的字母的第一个位置.
于是就有k=-1,j=0,先++再开始比较,此时k是0,j是1,如果匹配不成功,k就不断回到-1(因为nxt[0]是-1),j继续往后走,直到找到串的开头字母.
②然后就进行匹配成功的操作:k++,j++,如果匹配成功就继续比较下一位,如果失败就如下图所示:
绿色(深绿加浅绿)代表已经匹配好的t的子串,但是当k,j再右移的时候,两个"指针"指向的字母开始不同,这时候就寻找之前匹配过的串,看看有没有更短些的前后缀.也就出现了如图所示的k=nxt[k].

再看KMP算法的过程:
我觉得图已经很清晰了,后面看如果不懂的话再加文字吧…

最新文章

  1. 教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏
  2. 浏览器不支持HTML5
  3. USACO Section 3.2: Feed Ratios
  4. sql语句中能有中文 空格
  5. UVaLive 6694 Toy Boxes (二分+想法)
  6. [每日一题] 11gOCP 1z0-053 :2013-10-11 Flashback Data Archive属性.........................43
  7. Asp.Net MVC 实用视频教程
  8. android之调用webservice 实现图片上传
  9. Linux 所有命令都用不了,只有cd exit能用
  10. ORA-01994: GRANT failed: password file missing or disabled
  11. Ubuntu 中登录相关的日志
  12. POJ 2533 Longest Ordered Subsequence(DP 最长上升子序列)
  13. python中重要的模块--asyncio
  14. 【Elasticsearch全文搜索引擎实战】之Kibana搭建
  15. 英语口语练习系列-C01-好棒
  16. semantic ui框架学习笔记二
  17. Go 初体验 - 死锁的几种情况
  18. Java中char和String的相互转换
  19. python TypeError: &#39;int&#39; object is not callable 问题解决
  20. HttpWebRequest post 提交 C#的WebBrowser操作frame如此简单 WebClient 提交

热门文章

  1. Elasticsearch Top10 监控指标
  2. 获取 Docker 容器的 PID 号
  3. 7.nexus版本升级
  4. MES系统和ERP系统的区别是什么?
  5. aws-cli命令-ec2实例相关的操作
  6. Explain:你见过这样的Sql吗?
  7. PHP cURL抓取网上图片
  8. 齐博X1模板页面之间的继承关系
  9. 齐博x1where 标签动态变量查询/where 实现条件筛选与数据关联
  10. 33.ModelSerializer详解