字符串匹配问题

朴素字符匹配(也称暴力匹配)

主串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;
}

运行结果:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值