KMP算法代码实现

下面代码中,calculateNext 函数接受一个模式串 pattern,返回计算得到的 next 数组。主要步骤如下:

  1. 初始化 next 数组,长度为模式串的长度,初始值都为 0。
  2. 使用两个指针 ij,从第二个字符开始遍历模式串。
  3. pattern[i]pattern[j] 不相等时,根据已匹配的部分信息,更新 j 的位置,直到 j 为 0 或者 pattern[i]pattern[j] 相等。
  4. 如果 pattern[i]pattern[j] 相等,将 j 的值加 1。
  5. j 的值赋给 next[i]
  6. 返回计算得到的 next 数组。
#include 
#include 
#include 

std::vector<int> calculateNext(const std::string& pattern)
{
	int n = pattern.size();
	std::vector<int> next(n, 0);

	int j = 0;
	for (int i = 1; i < n; i++)
	{
		while (j > 0 && pattern[i] != pattern[j])
		{
			j = next[j - 1];
		}
		if (pattern[i] == pattern[j])
		{
			j++;
		}
		next[i] = j;
	}

	return next;
}

int kmpSearch(const std::string& s1, const std::string& s2)
{
	int m = s1.size();
	int n = s2.size();
	std::vector<int> next = calculateNext(s2);

	int j = 0;
	for(int i = 0; i < m; i++)
	{
		// 匹配失败
		while(j > 0 && s1[i] != s2[j])
			j = next[j - 1];
		// 匹配成功
		if(s1[i] == s2[j])
			j++;
		// 完全匹配
		if(j == n)
			return i - j + 1;
	}

	return -1;
}

int main()
{
	std::string text = "hello world!";
	std::string pattern = "wor";

	int result = kmpSearch(text, pattern);

	std::cout << "匹配字符的起始下标为: ";
	std::cout << result << std::endl;

	return 0;
}

你可能感兴趣的:(笔记,算法)