串的模式匹配的一般方法如算法4.5(在bo4-1.cpp 中)所示:由主串S 的第pos 个字
符起,检验是否存在子串T。首先令i 等于
pos(i 为S 中当前待比较字符的位序),j 等于
1(j 为T 中当前待比较字符的位序),如果S 的
第i 个字符与T 的第j 个字符相同,则i、j 各
加1 继续比较,直至T 的最后一个字符(找
到)。如果还没到T 的最后一个字符,比较就
出现了不同(没找到),则令i 等于pos+1,j 等
于1,由pos 的下一个位置起,继续查找是否
存在子串T。这个过程如图410 所示。
在算法4.5 中,主串S 的指针i 总要回溯,特别是在如图410 所示的有较多字符匹
配而又不完全匹配的情况下,回溯得更多。这时,主串S 的一个字符要进行多次比较,显
然效率较低。
如果能使主串S 的指针i 不回溯,在有些情况下效率则会大为提高。这是可以做到
的,因为主串S 中位于i-1,i-2,⋯ 的字符恰和子串T 中位于j-1,j-2,⋯ 的字符相
等,如图410 所示。仍以图410 为例,当S 和T 在第i(终值)个字符处字符不相符
时,i 仍保持在终值处不动,j 回溯到第1 个字符与i 的当前字符继续进行比较。j 回溯到第
几个字符是由子串T 的模式决定的。算法4.7 根据子串T 生成的next 数组指示j 回溯到第
几个字符。next 数组的意义是这样的:如果next[j]=k