说明:本文只是探讨对串这一数据结构中朴素模式匹配算法的实现中,i=i-j+2这一步的逻辑由来,仅为拙见,本人才疏学浅,也不会写文,只是学习中对这一步骤深有疑虑所以尝试用大话描述一下。欢迎批评,欢迎交流。希望能对学习的同好也略有帮助!
朴素模式匹配的实现代码:
此代码摘编自作者程杰的《大话数据结构》第五章第6节
//S[0] == S.length
//T[0] == T.length
int Index(String S,String T,int pos)
{
int i = pos; //i是指向S串的指针
//pos是指定开始查询的起始位置
int j = 1; //j是指向T串的指针
//要求指针i不能超出串S的长度,即i≤S[0]
//and 指针j不能超出串T的长度,即j≤T[0]
while(i<=S[0] && j<=T[0])
{
//如果当下指针i和j指向的串字符相等,
//就同时+1比较下一个位置
if(S[i]==T[i])
{
++i;++j;
}
//否则,S串指针需要移动到一个特殊位置
//T串指针只需移到首元素即可
else
{
i = i-j+2;//※本文的主要探讨目标
j = 1;
}
}
//...还有一点结尾,但是不在讨论范围内
}
i=i-j+2 :
实话实说,我看不懂,我大为震撼!但是好在我会度一下,粗略的看了一下一些博客,发现对其变形后更容易理解,因为这一结果应该也是分析后的浓缩!
i=(i-(j-1))+1
- (j-1)可以理解为:模式串已经和主串匹配的字符个数。
- 程序的目标:使得当前指针i的位置想要回溯到开始时i的位置的下一位。
- 先来说说(j-1)的逻辑:
- 已知:当前指针i的位置;
- 已知:匹配移动了多少个字符;
可求:指针i移动前的起始位置
比如说起始位置是1,已经匹配成功了3个字符,那现在指针i是不是指向了4,1+3=4,对吧?
那现在知道位置是4了,也知道匹配成功3个了,那是不是能反过去求起始位置1了? 所以i-(j-1)干的就是这么个事!
4. 最后加一是怎么一回事呢?想想我们的目标是啥,是不是要到下一位去,那可不得加1嘛。
总结梳理: