这学期学的串匹配算法,现在总结一下。
现在给出两个字符串。
S:ABACAACAD
T:ACAD
这个算法可以用来求串S(主串)是否包含串T(模式串)。
》》》》1.首先对模式串求next[]
如果j从1开始标号:第一项就是0,第二项就是2。
如果j从0开始标号:第一项就是-1,第二项就是0。
T的长度为4,前两个的next已经知道了,现在要求第三个。
以j从1开始标号为例子:
首先 int L=0,记录字符串长度。
现在要找两个数X,Y使得T[1]~T[x]组成的字符串和T[Y]~T[三-1]组成的字符串相等。令L为这两个字符串其中一个的长度。
(因为如果找到X和Y的话,就说明他们完全相同,包括长度。L的长度要这两个字符串相等的情况下最长的。例如:如果在L=1和L=2时,都能找到X,Y使得这两个字符串相等,则L取2)
然后 L++。
但是当前情况下找不到 ,则next[三]的值就是1.
求第四个的步骤同上。
首先 int L=0,记录字符串长度。
现在要找两个数X,Y使得T[1]~T[x]组成的字符串和T[Y]~T[四-1]组成的字符串相等。令L为这两个字符串其中一个的长度。
在T[1]~T[1]组成的字符串和T[3]~T[四-1]组成的字符串相等,则L=1.
然后 L++。
当前next[四]的值就是2.
(从1开始标号) j | 1 | 2 | 3 | 4 |
T[j] | A | C | A | D |
next[j] | 0 | 1 | 1 | 2 |
(从0开始标号)j | 0 | 1 | 2 | 3 |
T[j] | A | C | A | D |
next[j] | -1 | 0 | 0 | 1 |
》》》》2.进行串匹配
int i=1,j=1;//i用来对串S进行遍历,j用来对串T遍历。
int find=0;
while (i < =sLen && j < =pLen)
两种情况:
- S[i]和T[j]相同或者next[j]==0,则i++,j++.
- S[i]和T[j]不相同,则i不变,j=next[j].
S:ABACAACAD
T:ACAD
①i=1,j=1时:S[i]和T[j]相同,则i++,j++.
(此时i=2,j=2)
②i=2,j=2时:S[i]和T[j]不相同,则i不变,j=next[j].
(此时i=2,j=1)
③i=2,j=1时:next[j]==0,则i++,j++.
(此时i=3,j=1)
④i=3,j=1时:S[i]和T[j]相同,则i++,j++.
(此时i=4,j=2)
⑤i=4,j=2时:S[i]和T[j]相同,则i++,j++.
(此时i=5,j=3)
⑥i=4,j=2时:S[i]和T[j]相同,则i++,j++.
(此时i=5,j=3)
⑦i=5,j=3时:S[i]和T[j]相同,则i++,j++.
(此时i=6,j=4)
⑧i=6,j=4时:S[i]和T[j]不相同,则i不变,j=next[j].
(此时i=6,j=2)
⑨i=6,j=2时:S[i]和T[j]不相同,则i不变,j=next[j].
(此时i=6,j=1)