KMP 算法 主要是用来从一个主串s中查找子串p的位置
要从 s 中找 p 首先想到的就是暴力搜索
暴力搜索示例:
s = “abcdabce”
p = “bce”
- step 1:
a == b ? 不相等, 则next
- setp 2:
b==b ? c==c ? d==e? 显然 d!=e , next
- step 3:
c == b ? 不相等 , next ……
直至到最后找出结果
这么做的话会发现比较浪费, 在 setp 2中, p中的 b与c 都比较过了,能不能想办法不再比较 b 与c 了, 这个办法就是 kmp
下面给出 swift 版本代码 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| class Solution { var next: [Int] = []; func kmpSearch(_ s: String ,_ p: String) -> Int { next = getNext(p); let sLen = s.count; let pLen = p.count; let s = s.cString(using: .utf8); let p = p.cString(using: .utf8); var i = 0; var j = 0; while (i < sLen && j < pLen ) { if j == -1 || s?[i] == p?[j] { i += 1; j += 1; } else { j = next[j]; } } if j == pLen { return i - j; } return -1; } func getNext(_ p: String ) -> [Int] { let len = p.count; let p = p.cString(using: .utf8); var next = Array.init(repeating: 0, count: len); next[0] = -1; var k = -1; var j = 0; while j < len - 1 { if (k == -1 || p?[j] == p?[k]) { j += 1; k += 1; if p?[j] != p?[k] { next[j] = k; } else { next[j] = next[k]; } } else { k = next[k]; } } return next; } }
let so = Solution(); let result = so.kmpSearch("abaabababaaababaabaa","aabaa");
print(result);
|
原文地址 : 从头到尾彻底理解KMP
通读了两遍 , 大概理解了 , 脑袋记不住只能存下来了