KMP相对于原有的暴力匹配,更加优秀,在匹配失败的情况下,不需要往后一个一个挪而是直接挪到前面有最长匹配串的时候可以节约时间和内存,关键点在于怎么求匹配串的Next数组,最后在匹配失败的j位置利用j-next[j]实现KMP的字符串匹配优化
#include <iostream>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int next[10];
void getNext() {
int k=0;
memset(next,0,sizeof(next));
for(int i=1; i<s1.length(); i++) {
k = next[i-1];
if(s1[i]==s1[k]) {
next[i]=k+1;
} else {
while(true) {
int temp=next[k];
if(s1[i]==s1[temp]) {
next[i]=temp+1;
break;
}
if(temp<=0) {
next[i]=0;
break;
}
k--;
}
}
}
}
int main() {
getline(cin,s1);
getline(cin,s2);
s1 = s1 + " ";//添加空格简化问题
s2 = s2 + " ";
transform(s1.begin(),s1.end(),s1.begin(),::tolower);//字符串转小写
transform(s2.begin(),s2.end(),s2.begin(),::tolower);
getNext();//获取next数组
int ans=0;
int flag=-1;
int i=0,j=0;
while(i<s2.length()) {
while(i<s2.length() && j<s1.length() && s1.at(j)==s2.at(i)) {
if(j==s1.length()-1) {//结束
if((i-j==0) || (i-j>0 && s2[i-j-1]==' ')) {//判断前缀空格
ans++;//匹配字符串自增
if(flag==-1) {//获取第一位匹配字符
flag=i-j;
}
}
j=0;
break;//跳出循环
}
i++;
j++;
}
i++;
//**************
j=next[j];//划重点,next数组的运用
//**************
}
if(flag!=-1)
cout<<ans<<" "<<flag<<endl;
else
cout<<-1<<endl;
return 0;
}