您的位置:首页 > 其它

HDOJ 2087 剪花布条 [KMP]

2009-09-16 09:09 288 查看
//题目描述:HDOJ 2087 剪花布条
//问题抽象:典型的字符串匹配问题
//核心算法:KMP
//时间复杂度:O(n+m)
#include<iostream>
#include<string>
using namespace std;
const int MaxSize=1000;
//计算next[]值,kmp核心
void GetNext(string t,int next[])
{
int j,k;
j=0;k=-1;next[0]=-1;
while(j<(int)(t.size()-1))
{
if(k==-1 || t[j] == t[k])
{
j++;k++;
next[j]=k;
}
else
k=next[k];
}
}//O(n)
//kmp具体实现
int KMP(string s,string t,int i)
{
int next[MaxSize],j=0;
GetNext(t,next);
while (i<(int)s.size() && j<(int)t.size())
{
if (j == -1 || s[i] == t[j])
{
i++;j++;
}
else
j=next[j];
}
if (j >= (int)t.size())
return i;
else
return -1;
}//O(m)
//主函数,whie循环调用kmp,统计匹配次数
int main()
{
string s,t;
int i,count,k;
while(cin>>s,s!="#")
{
cin>>t;
i=0;count=0;
while(i<(int)s.size())
{
k=KMP(s,t,i);
if(k != -1)
{
count++;
i=k;
}
else
break;
}
cout << count <<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: