kmp 算法不好理解
常见问题理解
k = next[k - 1] 怎么理解
class Solution {
public:
vector<int> makeNext(const string& target) {
vector<int> next = vector<int>(target.size(), 0);
int k = 0;
for (int i = 1; i < target.size(); ++i) {
while (k > 0 && target[k] != target[i]) {
k = next[k - 1];
}
if (target[k] == target[i]) {
++k;
}
next[i] = k;
}
return next;
}
int kmp(const string& target, const string& pattern) {
auto next= makeNext(pattern);
int k = 0;
for (int i = 0; i < target.size(); i++) {
while (k > 0 && target[i] != pattern[k]) {
k = next[k - 1];
}
if (target[i] == pattern[k]) {
if (++k == pattern.size()) {
return i - (int)pattern.size() + 1;
}
}
}
return -1;
}
};
int main() {
string tar = "aabaaac";
string pat = "aac";
cout << Solution{}.kmp(tar, pat) << endl;
}
c++ 字符串匹配算法kmp算法
c++ 字符串匹配算法kmp算法
c++ 字符串匹配算法kmp算法
c++ 字符串匹配算法kmp算法
c++ 字符串匹配算法kmp算法
c++ 字符串匹配算法kmp算法
c++ 字符串匹配算法kmp算法
c++ 字符串匹配算法kmp算法
c++ 字符串匹配算法kmp算法
c++ 字符串匹配算法kmp算法