关于KMP算法,关键是部分匹配表的计算,本人觉得阮一峰的关于KMP算法的理解写的很好,文章地址http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
以下是C++代码,在leetcode 28上为AC。不过运行时间超慢,请大家多多指正。
class Solution {
public:
vector<int> createPartMatchTable(string needle) {
vector<int> part_match_table;
for (int needle_ix = 0; needle_ix != needle.length(); needle_ix++) {
int prefix_length = needle_ix;
while (prefix_length > 0) {
if (needle.substr(0, prefix_length) == needle.substr(needle_ix + 1 - prefix_length, prefix_length)) {
break;
}
prefix_length--;
}
part_match_table.push_back(prefix_length);
}
return part_match_table;
}
int strStr(string haystack, string needle) {
if (needle.empty()) {
return 0;
}
if (haystack.length() < needle.length()) {
return -1;
}
vector<int> part_match_table = createPartMatchTable(needle);
int hay_ix = 0;
int needle_ix = 0;
while (hay_ix < haystack.length()) {
while (needle_ix < needle.length()) {
if (haystack[hay_ix + needle_ix] != needle[needle_ix]) {
break;
}
needle_ix++;
}
if (needle_ix == needle.length()) {
return hay_ix;
}
else if (needle_ix == 0) {
hay_ix++;
}
else {
hay_ix += needle_ix - part_match_table[needle_ix - 1];
needle_ix = part_match_table[needle_ix - 1];
}
}
return -1;
}
};