HDOJ 2087 剪花布条 [KMP]

//题目描述: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; }

你可能感兴趣的:(算法,String)