2023年3月9日
#简单的模式匹配算法
字串的定位操作通常称为串的模式匹配,它求的是字串(常称模式串)在主串中的位置。这里采用定长顺序存储结构,给出一种不依赖于其他串操作的暴力匹配算法
int Index(SString S,SString T){ //s主串,T模式串
int i=1,j=1;
while(i<S.length && j<=T.length)
{
if(S.ch[i]==T.ch[j])
{
++i;++j;
}
else
{
i=i-j+2; //开始下一个字串的匹配
j=1;
}
}
if(j>T.length) return i-T.length;//匹配成功,返回当前字串的第一个位置
else return 0;
}
简单来说,在暴力匹配中,每趟匹配失败都是模式后移一位再从头开始比较
#KMP算法
前缀:指除最后一个字符以外,字符串的所有头部字串
后缀:指除第一个字符以外,字符串的所有尾部字串
部分匹配值:字符串的前缀和后缀的最长相等前后缀长度
以“ababa”为例:
'a'的前缀和后缀都为空集,最长相等前后缀长度为0
'ab'的前缀为{a},后缀为{b},{a}∩{b}=空,最长相等前后缀长度为0
'aba'的前缀为{a,ab},后缀为{a,ba},{a,ab}∩{a,ba}={a},最长相等前后缀长度为1
'abab'的前缀为{a,ab,aba},后缀为{b,ba,bab},两个相交={ab},最长相等前后缀长度为2
同理,最后一个的最长相等前后缀长度为3
故字符串'ababa'的部分匹配值为00123
代码随想录中给的非常详细,建议配合视频进行学习 代码随想录 (programmercarl.com)