查找字符串位置之暴力匹配算法

大圣苦苦寻找紫霞仙子,,,,,

查找字符串位置之暴力匹配算法

(*)暴力匹配算法

问题:有两个字符串,s1是母串,s2是子串,要在母串中找子串出现的位置。

s1: SJHETCSAGYA
s2: CS

用暴力匹配思路就是:用s1[i]和s2[j]去匹配,如果匹配成功,i++,j++,即s1和s2都后移一位,匹配下一位;如果匹配失败,让i=i-j+1;j=0;即让s1后移一位,s2回溯,从s1的下一位重新匹配;
代码如下:

#include<iostream>
#include<string.h>
using namespace std;
int violence(char *s1, char *s2)     //暴力匹配算法
{
	int len1 = strlen(s1);
	int len2 = strlen(s2);
	int i, j;
	for (i = 0, j = 0; i < len1&&j < len2;)
	{
		if (s1[i] == s2[j])        //如果匹配成功,i++,j++;即s1和s2都后移,匹配下一位;
		{
			i++;
			j++;
		}
		else                       //如果匹配失败,让s1后移,s2回溯;重新进行匹配下一位;
		{
			i = i - j + 1;
			j = 0;
		}
	}
	if (j == len2)                //找到s2,就返回它的位置;
		return i - j;
	else
		return -1;
}
int main()
{
	char s1[1005], s2[1005];
	cin >> s1 >> s2;
	int k=violence(s1, s2);
	cout << k << endl;
	return 0;
}

查找字符串位置之暴力匹配算法
查找字符串位置之暴力匹配算法
图解:

第一次循环
s1[0]=S,s2[0]=C,即匹配失败,执行“i = i - j + 1; j = 0;”,执行后i=1,j=0;相当于s2后移一位与s[1]进行匹配;
查找字符串位置之暴力匹配算法

第二次循环
s1[1]=J,s2[0]=C,又匹配失败,执行“i = i - j + 1; j = 0;”,执行后i=2,j=0;相当于s2后移一位与s[1]进行匹配;查找字符串位置之暴力匹配算法

第三次循环
s1[2]=H,s2[0]=C,又匹配失败,执行“i = i - j + 1; j = 0;”,执行后i=3,j=0;相当于s2后移一位与s[1]进行匹配;查找字符串位置之暴力匹配算法

第四次循环
s1[3]=E,s2[0]=C,又匹配失败,执行“i = i - j + 1; j = 0;”,执行后i=4,j=0;相当于s2后移一位与s[1]进行匹配查找字符串位置之暴力匹配算法

第五次循环
s1[4]=T,s2[0]=C,又匹配失败,执行“i = i - j + 1; j = 0;”,执行后i=5,j=0;相当于s2后移一位与s[1]进行匹配查找字符串位置之暴力匹配算法

第六次循环
s1[5]=C,s2[0]=C,匹配成功,执行“ i++;j++;”,执行后i=6,j=1;查找字符串位置之暴力匹配算法

第七次循环
s1[6]=S,s2[1]=S,匹配成功,执行“ i++;j++;”,执行后i=7,j=2;此时j不满足循环条件”j<len2";所以不再执行循环。返回子串的位置:k=i-j=7-2=5;
查找字符串位置之暴力匹配算法

大圣一路披荆斩棘,终是找到了紫霞仙子,虽然时间长了一点,但比起一万年来,还是短的;

查找字符串位置之暴力匹配算法
暴力匹配算法得时间复杂度太高,很容易超时,为了让大圣早点找到紫霞仙子,所以,才有了KMP算法。
下一篇,KMP算法。