【正文】
} 求模式串 t的 next函數(shù)值算法 4. 串的應(yīng)用 ——KMP模式匹配算法 1. 在串 s和串 t中分別設(shè)比較的起始下標(biāo) i和 j; 2. 循環(huán)直到 s中所剩字符長(zhǎng)度小于 t的長(zhǎng)度或 T中所有字符均比較完畢 如果 s[i]=t[j], 繼續(xù)比較 S和 T的下一個(gè)字符;否則 將 j向右滑動(dòng)到 next[j]位置 , 即 j=next[j]; 如果 j=0, 則將 i和 j分別加 1, 準(zhǔn)備下一趟比較; 3. 如果 t中所有字符均比較完畢,則返回匹配的起始下標(biāo);否則返回 0; 4. 串的應(yīng)用 ——KMP模式匹配算法 例:設(shè)主串 s=abcabcabd,模式串 p=abcabd,按 KMP算法進(jìn)行模式匹配,當(dāng) s0s1s2s3s4=p0p1p2p3p4,且s5≠p5時(shí),應(yīng)進(jìn)行 比較。 next[j]=k。 while (jt[0]) if ((k==0)| |(t[j]= =t[k])) { j++。 j=1。next[j]=1表示從模式串頭部開始進(jìn)行字符比較 j=1時(shí) , next[ j ]= 0; j=2時(shí) , next[ j ]= 1; j=3時(shí) , t1≠t2,因此, k=1; j=4時(shí) , t1= t3,因此, k=2; j=5時(shí) , t1= t4,因此, k=2; 以此類推。 4. 串的應(yīng)用 ——KMP模式匹配算法 4. 串的應(yīng)用 ——KMP模式匹配算法 ? 計(jì)算 next[j]的方法: ? 當(dāng) j=1時(shí), next[j]=0; //next[j]=0表示根本不進(jìn)行字符比較 ? 當(dāng) j1時(shí), next[j]的值為:模式串的位置從 1到 j1構(gòu)成的串中所出現(xiàn)的首尾相同的子串的最大長(zhǎng)度加 1。 從第 1位往右 經(jīng)過(guò) k1位 從 j1位往左 經(jīng)過(guò) k1位 k= max { k |1kj 且 T1…T k1= Tj(k1) …T j1 } T1…T k1= Tj(k1) …T j1的物理意義是什么? 模式應(yīng)該向右滑多遠(yuǎn)才是最高效率的 ? 4. 串的應(yīng)用 ——KMP模式匹配算法 next[ j ]= 0 當(dāng) j= 1時(shí) //不比較 max { k | 1kj 且 T1…T k1=Tj(k1) …T j1 } 1 其他情況 令 k = next[ j ],則: next[j]函數(shù)表征著模式 T中最大相同首子串和尾子串(真子串)的長(zhǎng)度。t1≠t3 ∴ t1≠s5 a b a b c a b c a c b a b a b c a c 第 5 趟 4. 串的應(yīng)用 ——KMP模式匹配算法 a b a b c a b c a c b a b a b c a c 第 3 趟 i j i=7, j=5失敗s5=t3。t1≠t2 ∴ t1≠s2 a b a b c a b c a c b a b i j 第 1 趟 a b c a c a b a b c a b c a c b a b a b c a c 第 3 趟 4. 串的應(yīng)用 ——KMP模式匹配算法 a b a b c a b c a c b a b a b c a c 第 3 趟 i j i