KMP½Ž—法
KMP½Ž—法是一¿U改˜q›çš„å—符串匹é…算法,æ¤ç®—法å¯ä»¥åœ¨O(n+m)的时间数é‡çñ”上完æˆä¸²çš„æ¨¡å¼åŒ¹é…æ“ä½œï¼ŒåŸºæœ¬æ€æƒ³æ˜¯ï¼Œæ¯å½“匚w…˜q‡ç¨‹ä¸å‡ºçް嗽W¦ä¸²æ¯”较ä¸ç‰æ—Óž¼Œä¸éœ€å›žæº¯æŒ‡é’ˆåQŒè€Œæ˜¯åˆ©ç”¨å·²ç»å¾—到çš?#8220;部分匚w…”¾l“æžœž®†æ¨¡å¼å‘å?#8220;滑动”ž®½å¯èƒ½è¿œçš„一ŒDµè·¼›»ï¼Œæ®å¾˜q›è¡Œæ¯”较ã€?/font>
定义åQ?/font>
â‘ ã€€è¦æœç´¢çš„关键å—符ä¸?nbsp;key K1K2......Kmã€?/font>
② 被æœç´¢çš„æºå—½W¦ä¸² source S1S2.....Snã€?/font>
u é’ˆå¯¹è¦æŸ¥æ‰„¡š„关键å—å—½W¦ä¸²æž„é€ å¤±æ•ˆå‡½æ•°f(s)åQŒè¯¥å‡½æ•°çš„功能就是在比较å½?/font>Ki != Sj的时候计½Ž—出从K的第多少个嗽W¦å¼€å§‹é‡æ–°æ¯”较ã€?/font>
使得K1K2...Kf(s)是最长的既是K1K2...Ks的的真剾~€åQŒåˆæ˜?/font>K1K2...Ks的厾~€çš„å—ä¸?/font>。也ž®±æ˜¯è¯´å¦‚果我们试囄¡”¨ä¸€ä¸ªæ–‡æœ¬ä¸²x匚w…K1K2......KmåQ?/font>òq¶ä¸”我们已ç»åŒšw…了å‰i个嗽W¦ï¼Œä½†åŒ¹é…Ki+1的时候失败,也就是说x的下一个佾|®ä¸æ˜¯Ki+1åQŒé‚£ä¹ˆf(s)ž®±æ˜¯å¯èƒ½å’Œæˆ‘们当å‰ä½¾|®äØ“¾l“尾的文本串匚w…的最长的K1K2......Km的剾~€å’Œå޾~€y。也ž®±æ˜¯è¯´æ–‡æœ?/font>x的下一个佾|®å’ŒKf(s)比较åQ?/font>X当å‰ä½ç½®ä¹‹å‰çš„f(s)个嗽W¦å’ŒK1..Kf(s)是匹é…的。所以直接从Kf(s)之厘q›è¡Œæ¯”较ã€?/font>
½Ž—法如下åQ?/font>
t = 0; f(1) = 0; for (i = 1; i < m; i++) { while(t > 0 && (Ki+1 != Kt+1)) t = f(t); if(Ki+1 == Kt+1) { t = t + 1; f(i+1) = t; } else f(i+1) = 0; } |
对于ä¸?/font>"a b a b a a"的计½Ž—f(s)的过½E‹å¦‚下:
s |
f(s) |
当å‰å—符ä¸?/span> |
说明 |
1 |
0 |
a |
æ— çœŸå‰ç¼€ |
2 |
0 |
ab |
æ— çœŸå‰ç¼€ |
3 |
1 |
aba |
"a"æ˜?aba"的真å‰ç¼€å’Œå޾~€ |
4 |
2 |
abab |
"ab"æ˜?abab"的真å‰ç¼€å’Œå޾~€ |
5 |
3 |
ababa |
"aba"æ˜?ababa"的真å‰ç¼€å’Œå޾~€ |
6 |
1 |
ababaa |
"a"æ˜?ababaa"的真å‰ç¼€å’Œå޾~€ |
u 针检æŸ?/font>S1S2.....Sn是å¦åŒ…å«å…³é”®å?/font>K1K2......Km的算æ³?/font>ã€?/font>
s = 0; for (i = 1; i <= n i++) { // ä¸‹æ ‡ä»?å¼€å§?/font> while (s > 0 && Si != Ks+1) s = f(s); if(Si == Ks+1) s = s + 1; if(s == n) return "yes"; } return "no"; |