模式匹配:子串在主串中的定位称为模式匹配或串匹配(字符串匹配) 。模式匹配成功是指在主串S中能够找到模式串P,否则,称模式串P在主串S中不存在。
Brute-Force模式匹配算法
该算法的思想是:
分别利用计数指针i和j指向主串S和模式串P中当前正待比较的字符位置,从主串的第pos个字符起和模式串的第一个字符开始比较,如果相同,则继续比较后续字符,否则从主串的下一个字符起再重新与模式串进行比较,以此类推。若主串中存在字串与模式串完全匹配,则匹配成功,反之匹配失败。
设S为目标串,P为模式串,则在匹配时:
该算法的优点是简单,便于理解,但是时间复杂度较高。因为每一次匹配失败主串指针要回到开始字符的下一位置,模式串的指针都要回到开头。通常情况下,实际运行过程中,该算法的执行时间近似于O(n+m) 。 该算法的最坏情况下的时间复杂度为O(n*m) ,其中n 、m分别是主串和模式串的长度。
算法实现:
#include<iostream>
using namespace std;
#define MaxStrLen 255//串长不大于255都可以
typedef unsigned char SString[MaxStrLen + 1];//0号单元存放串的长度
//返回子串P在主串S中第pos个字符之后的位置。若不存在,函数返回0。其中,P非空,1≤pos≤StrLength(S)
int Index(SString S, SString P, int pos)
{
int i = pos; //S指针位置
int j = 1; //P指针位置
while (i <= S[0] && j <= P[0])
{
if (S[i] == P[j])
{ // 继续比较后继字符
i++;
j++;
}
else
{ // 指针后退重新开始匹配
i = i - j + 2;//注意i的值
j = 1;
}
}
if (j > P[0])
{
return i - P[0]; //找到了
}
else
{
return 0; //没找到
}
}