一种KMP算法的C++实现

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

class KMP //定义KMP方法类
{
	private:
		vector<int> next_vec;
		string pat;
	public:
		KMP(string pat):pat(pat)
		{
			next_vec=vector<int>(pat.size());
			next_vec[0]=0;
			for(int i=1,j=0;i<pat.size();i++)
			{
				while(j>0 && pat[i]!=pat[j]) j=next_vec[j-1];
				if(pat[i]==pat[j]) j++;
				next_vec[i]=j;
			}
		}
		
		int search_in(string txt)
		{
			for(int i=0,j=0;i<txt.size();i++)
			{
				while(j>0 && txt[i]!=pat[j]) j=next_vec[j-1];
				if(txt[i]==pat[j]) j++;
				if(j==pat.size()) return i-j+1;
			}
			return -1;
		}	
};


int main()
{
	string txt("yuikfghkyabcdabcdabcdeffeuigrks");
	string pat("abcdabcdabcdeff");
	
	KMP k(pat); //先用模式串初始化一个KMP对象
	cout<<k.search_in(txt); //再用这个KMP对象在主串中搜索
	
	
	return 0;
}

依赖的头文件 <string> <vector> 使用的命名空间std

在这种KMP算法的实现中,以vector<int> next_vec作为next函数(数组),

next_vec[i]的意义是模式串下标i匹配成功但是下一个(i+1)失败时,下一次匹配的位置

这里说的下标从0开始,即字符串第一个字符是0

posted @ 2024-11-18 12:28  囫囵吞桃  阅读(1)  评论(0)    收藏  举报  来源