我是靠谱客的博主 眼睛大饼干,最近开发中收集的这篇文章主要介绍KMP算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目描述
学习KMP算法,给出主串和模式串,求模式串在主串的位置
算法框架如下,仅供参考
输入
第一个输入t,表示有t个实例
第二行输入第1个实例的主串,第三行输入第1个实例的模式串
以此类推
输出
第一行输出第1个实例的模式串的next值
第二行输出第1个实例的匹配位置,位置从1开始计算,如果匹配成功输出位置,匹配失败输出0
以此类推
样例输入
3
qwertyuiop
tyu
aabbccdd
ccc
aaaabababac
abac
样例输出
-1 0 0
5
-1 0 1
0
-1 0 0 1
8

思路

#include<iostream>
using namespace std;
class myString{
	private:
		string mainstr;
		int size;
		void getNext(string p, int next[]){//获取next数组
			int len= p.length();
			int i= 0; 
			next[i]= -1;
			int j= -1;
			while(i< len){
				if(j== -1||p[i]== p[j]){
					i++;j++;
					next[i]= j;
				}
				else
				 j= next[j];
			}
		}
		int KMPfind(string p, int pos, int next[]){
			int i= pos;
			int j= -1;
			int len= mainstr.length();
			int len1= p.length();
			while(i< len&&j< len1){
				if(j== -1||mainstr[i]== p[j]){
					i++; j++;
				}
				else
				  j= next[j];
			}
			if(j>= len1)//j>=len1说明匹配串完全走完了,即有与它匹配的子串
			  return i- len1+ 1;
			else
			  return 0;
		}
	public:
		myString(){
			size= 0;
			mainstr= "";
		}
		void setval(string st){
			mainstr= st;
			size= mainstr.length();
		} 
		int KMP(string p, int pos){
			int len= p.length();
			int *next= new int [len+ 5];
			getNext(p, next);
			
			for(int i= 0; i< len; i++)
			 cout<<next[i]<<' ';
			
			cout<<endl<<KMPfind(p, pos, next)<<endl;
		}
};
int main(){
	int t;
	
	cin>>t;
	while(t--){
		string str;
		string p;
		cin>>str>>p;
		myString mystring;
		mystring.setval(str);
		mystring.KMP(p, 0);
	}
}

最后

以上就是眼睛大饼干为你收集整理的KMP算法的全部内容,希望文章能够帮你解决KMP算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部