朴素字符匹配(也称暴力匹配)
主串S: A B A B A B C
模式串M: A B C
i=0, j = 0;//初始化,从第一个字符比起
S[0] == M[0] ; I++,J++
S[1] == M[1]; I++,J++
S[2] != M[2]; 此时再从模式串M第一个字符重新开始,与主串第二个字符往后一一再进行比较
I = 2 – 2 + 1 = 1;
S[1] != M[0] ; 这是主串中以第二个字符为头往后与M串不匹配,主串中的游标i再继续向下走,
I = 1 – 0 + 1 = 2;J = 0;
S[2] == M[0] ;
I ++ ; J ++;
S[3] == M[3] ; I++, J++;
I = 4 – 2 +1 = 3; J = 0;
S[4] ==M[0]; I++; J++
S[5] == M[5]; I++; J++
S[6] == m[6] ; I++; J++
匹配成功
【可以试着找一下主串S的游标i与模式串M的游标 j 之间的关系。】
i = i – j + 1;//这点很重要,一定要理解
i = i-j回到主串s与主串m第一个字符比较的字符所在位置,发现不匹配,则s串从下一个字符开始,与m串重新比较,所以要再加1
代码:
#include<iostream>
#include<cstring>
using namespace std;
int NativeStringSearch( string s, string m);
int main()
{
string s ,m;
cin>>s>>m;
int idx = NativeStringSearch( s, m );
if (idx == -1)
{
cout<<"未匹配";
}
else
{
cout<<"在"<<idx+1<<"位置匹配成功"<<endl;
}
return 0;
}
int NativeStringSearch( string s, string m)
{
int i = 0;
int j = 0;
while (i < s.length() && j < m.length())
{
if ( s[i] == m[j] )
{
i++;
j++;
}
else
{
i = i - j + 1;//i = i-j不匹配,回到s串这一轮比较的第一个字符,从s串下一个字符重新比较,再加1,开始下一轮比较
j = 0;//下一轮重新比较,从m串第一个字符出发
}
}
if (j == m.size())
return i - j;
return -1;
}
运行结果: