杭电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
- 杭电 hdu 2087 剪花布条
- 杭电2087-剪花布条
- 杭电2087 剪花布条
- 杭电2087 剪花布条
- 杭电---2087剪花布条
- 杭电2087 剪花布条
- 杭电2087剪花布条
- 【杭电】[2087]剪花布条
- 【杭电oj】2087 - 剪花布条
- 杭电 2087 剪花布条
- acm杭电2087-剪花布条
- 杭电 2087 剪花布条 kmp水题
- 杭电OJ2087 剪花布条
- 【杭电oj2087】剪花布条
- 杭电ACM—HDU2087 剪花布条
- 2087 剪花布条
- 2087 剪花布条
- HDU 2087 剪花布条
- 51nod 1298 圆与三角形
- dedecms专栏----资料收集
- 关于3个div,一个固定大小,两个自定义。方法
- 用c语言实现的dft逆变换
- [LeetCode 135]Candy
- 杭电2087 剪花布条
- poj2407小于n的相对素数
- 第四周项目四 指向学生类的指针
- windows程序设计 注册窗口类
- http请求工具类
- PHP学习笔记(九)图形图像操作
- tomcat post,get 编码设置
- AngularJS中的控制器
- windows程序设计 创建窗口