[LeetCode]28. Implement strStr()
题目描述
思路
kmp算法实现
参考:
http://blog.csdn.net/v_july_v/article/details/7041827
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class Solution {
public:
int strStr(string haystack, string needle) {
if (needle.size() == 0) return 0;
vector<int> next = getNext(needle);
//print(next);
for (int i = 0, j = 0; i < haystack.size();) {
if (haystack[i] == needle[j]) ++i, ++j;
if (j == needle.size()) return i - j;
else if (i < haystack.size() && haystack[i] != needle[j]) {
if (j) j = next[j - 1];
else ++i;
}
}
return -1;
}
vector<int> getNext(string needle) {
int len = needle.size();
vector<int> next(len, 0);
for (int i = 1, subLen = 0; i < len;) {
if (needle[i] == needle[subLen]) next[i++] = ++subLen;
else if (subLen) subLen = next[subLen - 1];
else next[i++] = 0;
}
return next;
}
void print(vector<int> nums) {
for (int num : nums)
cout << num << " ";
cout << endl;
}
};
int main() {
Solution s;
cout << s.strStr("aabaaabaaac", "aabaaac") << endl;
system("pause");
return 0;
}