问题描述:有一个文本串S,和一个模式串P,查找P在S中的位置
暴力破解法:
- int ViolentMatch(char* s, char* p)
- {
- int sLen = strlen(s);
- int pLen = strlen(p);
- int i = 0;
- int j = 0;
- while (i < sLen && j < pLen)
- {
- if (s[i] == p[j])
- {
- //①如果当前字符匹配成功(即S[i] == P[j]),则i++,j++
- i++;
- j++;
- }
- else
- {
- //②如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0
- i = i - j + 1;
- j = 0;
- }
- }
- //匹配成功,返回模式串p在文本串s中的位置,否则返回-1
- if (j == pLen)
- return i - j;
- else
- return -1;
- }
看的头大 http://blog.csdn.net/v_july_v/article/details/7041827 ~~~~
#include <iostream>
#include <string>
using namespace std;
void getnext(string p,int next[])
{
int plen=p.length();
next[0]=-1;
int k=-1;//前缀
int j=0;//后缀
while(j<plen-1)
{
if (k==-1 || p[j]==p[k])
{
j++;
k++;
if(p[j]!=p[k])
next[j]=k;
else//不出现循环
next[j]=next[k];
}
else{
k=next[k];
}
}
}
void kmp(string s,string p,int next[])
{
int slen=s.length();
int plen=p.length();
int i=0;
int j=0;
while(i<slen-1 && j<plen-1)
{
if(j==-1 || s[i]==p[j])//j==-1 !!!!!
{
i++;
j++;
}
else
j=next[j];
}
if(j==plen-1)
{
cout<<"true"<<endl;
}
else
cout<<"false"<<endl;
}
int main()
{
string s;
string p;
cin>>s;
cin>>p;
int *next=new int[p.length()];
getnext(p,next);
kmp(s,p,next);
delete [] next;
return 0;
}