4.3.1 求子串位置的定位函数Index(S,T,pos)
子串的定位操作通常称做串的模式匹配(其中T称为模式串),采用定长顺序存储结构,可以写出不依赖于其他串操作的匹配算法。
算法4.5:
下面是书中的伪代码:
int Index(SString S, SString T, int pos) { // 返回子串T在主串S中第pos个字符之后的位置。 // 若不存在,则函数值为0。 // 其中,T非空,1≤pos≤StrLength(S)。 int i = pos; int j = 1; while (i <= S[0] && j <= T[0]) { if (S[i] == T[j]) // 继续比较后继字符 { ++i; ++j; } else // 指针后退重新开始匹配 { i = i - j + 2; j = 1; } } if (j > T[0]) return i - T[0]; else return 0;} // Index下面分析下:
这里先说明下,这个S[0],T[0]这个地方存储了整个串的大小。
这个代码的巧妙之处在于i=i-j+2和j=1这个地方,这个i=j-j+2,可以让i进行后移,也就是S后移,这里j=1,的意思如下:举个例子,当T中是ABC,而S是ABABABC,pos为1,那么j=1的作用就是清理,什么叫清理,意思就是当发现S中只有前两个字母相似,而没有第三个,这时重新计数。当然i也要进行回溯。
下面这张图,提现了这个过程(T='abcac'和主串S,pos=1)这节就到这,下一节讲解数据结构里面的第一个难点:
KMP算法!
新闻热点
疑难解答