杭电2087 剪花布条
2015-04-02 22:47
204 查看
KMP算法:
字符串题,题目要求便是求一大串字符里面有几个小字符串。
用到的是KMP算法。
KMP算法思想大致就是:设长字符串为string str,小字符串为string s。1》首先对s中的字符进行自己匹配,找到有相同字符的地方,并记录下来该位置k。2》开始循环对比str与s中的字符。当出现两字符串中字符不相同的位置时,对循环i进行加k即可。
移动位数 = 已匹配的字符数 - 对应的部分匹配值
代码如下:
最后分享一个连接:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
这上面的思想很好理解,比书上的代码还好理解。
字符串题,题目要求便是求一大串字符里面有几个小字符串。
用到的是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
这上面的思想很好理解,比书上的代码还好理解。
相关文章推荐
- 杭电2087 剪花布条
- 杭电 hdu 2087 剪花布条
- 杭电 2087 剪花布条
- 杭电2087剪花布条
- 杭电2087-剪花布条
- 【杭电】[2087]剪花布条
- acm杭电2087-剪花布条
- 杭电2087 剪花布条
- 杭电 2087 剪花布条
- 【杭电oj】2087 - 剪花布条
- 杭电---2087剪花布条
- 杭电 2087 剪花布条 kmp水题
- hdoj 2087 剪花布条 【KMP】
- HDU 2087 剪花布条 KMP入门
- HDOJ HDU 2087 剪花布条 ACM 2087 IN HDU
- HDU- KMP模板题 - 1686 Oulipo - 2087 剪花布条 - 3746 Cyclic Nacklace
- hdu 2087剪花布条
- HDU-2087 剪花布条 (KMP)
- hdoj 2087 剪花布条
- 剪花布条 - HDU 2087(简单KMP | 暴力)