步骤:
- s主串 t模式串
- j指向主串 k指向模式串
- 如果此时俩个串中位置上的字符相同 j++,k++
- 如果不同j返回到此轮下标的下一个,k返回到起点(j=j-k+1,k代表此轮查找匹配了的长度,也是j在此轮向后移动的距离)
- k==t.length()说明找到了,反之没找到
- 返回的是模式串在主串中第一次出现的下标
#include<iostream>
using namespace std;
int main(){
string s,t;
// s 主串 下标j
// t 模式串 下标k
cin>>s>>t;
int lens=s.length();
int lent=t.length();
int j,k;
for(j=0,k=0;j<lens&&k<lent;){
if(s[j]==t[k]){
j++;
k++;
}
else{
j=j-k+1;//这一轮j的下一个 k:表示查询到的t的长度
k=0;//回到模式串起点
}
}
if(k>=lent){
cout<<"第一次匹配的位置:"<<j-lent<<endl;
}
else{
cout<<"NO"<<endl;
}
return 0;
}