您的位置:首页 > 其它

算法导论—KMP

2016-02-25 10:46 183 查看
华电北风吹

日期:2016/2/24

KMP精要:

KMP在进行朴素匹配时,如果发现不匹配字符时,通过对已经匹配的那部分字符串的最大前缀来快速找到下一个模式串需要匹配的位置。KMP对模式进行预处理时间复杂度O(m),匹配时间复杂度O(n),总的KMP时间复杂度为O(m+n)。

参考资料:

关于kmp原理讲解具体可以参考字符串匹配的KMP算法— 阮一峰

参考代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Solution
{
public:
vector<int> nextVector(string pattern)
{
int m = pattern.size();
vector<int> result(m);
for (int i = 1; i < m; i++)
{
int j = result[i - 1];
while (j&&pattern[i] != pattern[j])
j = result[j - 1];
result[i] = pattern[i] == pattern[j] ? j + 1 : 0;
}
return result;
}
vector<int> KMP(string str, string pattern)
{
int n = str.size(), m = pattern.size();
vector<int> arr = nextVector(pattern);
vector<int> result;
int p = 0;
for (int i = 0; i < n; i++)
{
while (p>0 && pattern[p] != str[i])
p = arr[p - 1];
if (str[i] == pattern[p])
p++;
if (p == m)
result.push_back(i - p + 1);
}
return result;
}
};

int main(int argc, _TCHAR* argv[])
{
Solution s;
string str = "BBC ABCDAB ABCDABCDABDE";
string patter = "ABCDABD";
vector<int> v = s.KMP(str, patter);
for (auto i : v)
cout << i << endl;

getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: