摘要:使用shift-and算法在母字符串“ABCABCADCABD”中找到子串“ABCAD”
一、思路:通过二进制运算暗藏的神奇信息来(超帅的)解决字符串匹配问题
1、得到母串与模式串(子串)
2、生成辅助表;通过模式串(子串)"ABCAD"的信息生成辅助表以此记录子串中各字符的位置信息。,
这个对应值的神奇之处:(这部分可以先瞄一眼,等后面计算内容明白了你就会恍然大悟了)
1、一个值就可以记录一个字符其在串中出现的位置信息,A:01001就可以记录出现了两次的A。当有相同前后缀时可以更快匹配,这部分与kmp算法有异曲同工之妙。
2、这个值与子串的方向是是相反的,我们后面进行低位到高位的计算——>意味着是对子串字符从左到右进行信息比对。
子串(模式串) | A | B | C | A | D | 字符对应值 |
(模式串反过来的串) | D | A | C | B | A | |
A | 0 | 1 | 0 | 0 | 1 | 01001 |
B | 0 | 0 | 0 | 1 | 0 | 00010 |
C | 0 | 0 | 1 | 0 | 0 | 00100 |
D | 1 | 0 | 0 | 0 | 0 | 10000 |
key(初始值为0) | 0 | 0 | 0 | 0 | 0 | 00000 |
3、进行循环读入字符判断是否匹配
注意:key初始值为0或者为1都是可以实现的,初始值为1的话就与字符判断后移位,
当读取到母串中的字符是子串中没有出现过的字符时,这个字符的对应值为0。
3.1读入母串第1个字符
操作 |
值 |
|
读入母串中一个字符进行的循环 |
1、key=(key<<1)+1 (初始key值为0) |
key :00000→00001 |
读入相应字符并通过查 辅助表得到对应值 |
此时读入字符‘A’并查表取值 ‘A’ :01001 key :00001 |
|
2、key = key &字符对应值 |
key :00001 (匹配情况:A****) |
|
3、判断key是否≥10000(二进制) Key≥10000则成功匹配模式,可以退出循环了 |
key: 00001<10000 继续循环 |
key与字符进行按位与(&)后的含义:(注意,这里的key是指进行&字符值操作后的key值)
依次读入字符后,key判定时的情况(总体情况,可以浏览一下):
3.2读入母串第2个字符