杭电2087 剪花布条

来源:互联网 发布:c语言寄存器 编辑:程序博客网 时间:2024/04/29 18:34

KMP算法:

字符串题,题目要求便是求一大串字符里面有几个小字符串。
用到的是KMP算法。
KMP算法思想大致就是:设长字符串为string str,小字符串为string s。1》首先对s中的字符进行自己匹配,找到有相同字符的地方,并记录下来该位置k。2》开始循环对比str与s中的字符。当出现两字符串中字符不相同的位置时,对循环i进行加k即可。

移动位数 = 已匹配的字符数 - 对应的部分匹配值

代码如下:

#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;int solve(int j,string s){int k=0;int ans=1e9;string s1="",s2="";for(int i=0;i<j-1;++i){s1+=s.at(i);s2=s.at(j-1-i)+s2;if(s1.compare(s2)==0){k=j-s1.size();if(ans>k)ans=k;}}if(k==0)ans=j+1;//接收后要返回一个移动位置j+1;要是不+1,当j=0时会死循环,因为for后面没有++i,所以每个条件下                         //都应有个+条件。return ans;}int main(){string str;string s;while (cin>>str){if(str=="#")break;cin>>s;int j=0;int flag=0,num=0,t=0;for(int i=0;i<str.size();){   if(str.at(i)==s.at(j)){i++;j++;flag++;}else{i=t+solve(j,s);t=i;j=0;flag=0;}if(flag==s.size()){num++;flag=0;j=0;++i;}}cout<<num<<endl;}return 0;}

最后分享一个连接:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

这上面的思想很好理解,比书上的代码还好理解。

0 0
原创粉丝点击