• KMP字符串匹配算法


    KMP字符串匹配算法,重点在于Next值的计算,下面是这个算法的代码:

    #include<iostream>
    #include<string>
    using namespace std;
    
    #define size 8
    
    
    int main()
    {
    	int ifr;
    	int next[size]={0,0,0,0,0,0,0};
    	char pst[size]={'a','b','a','a','b','c','a','c'};
    	char sstr[17]={'a','c','a','b','a','a','b','a','a','b','c','a','c','a','a','b','c'};
    	
    
    	void getNext(int next[size]);
    	int  fastPattStr(const char *sstr,const char *pst,int *next);
    	
    	cout<<"KMP字符串匹配算法"<<endl;
    	getNext(next);
    	for(int i=0;i<size;i++)
    		cout<<next[i]<<" ";
    		cout<<endl;
    	if(ifr!=-1)
    	{
    		cout<<"Location:"<<fastPattStr(sstr,pst,next)<<endl;
    	}
    	else
    	{
    		cout<<"字符串不能正确匹配"<<endl;
    	}
    	return 0;
    }
    
    /*寻找下一次开始比较位置:递推,根据已知求未知*/
    void getNext(int next[size])
    {
    	int j=0;
    	/*j=0时,next[0]=-1*/
    	next[0]=-1;
    	int k=-1;
    	//int max=0;
    	//int r=0;
    	/*直到求到模式串的结尾*/
    	while(j<size)
    	{
    		if(k==-1 || pst[k]==pst[j])
    		{
    			j++;
    			k++;
    			next[j]=k;
    		}
    		else
    		{
    			k=next[k];
    		}
    		/*if(k>j-1)
    		{
    			/*其他情况
    			next[j]=0;
    		}
    		else
    		{
    			/*k>=0且k<j-1 next[j]=k+1
    			do
    			{	
    				r=j-k-1;
    				for(int i=0;i<=k;i++)
    				{
    					if(pst[i]==pst[r])
    						r++;
    					else
    						break;
    				}
    				if(max<k+1)max=k+1;				
    				k++;
    			}while(k<j-1);
    			next[j]=max;
    		}*/
    		
    	}
    	
    }
    /*字符串匹配函数*/
    int  fastPattStr(const char *str,const char *pstr ,int next[])
    {
    	int s_pos=0;
    	int p_pos=0;
    	int s_len;
    	s_len=17;
    	
    	/*如果模式串位置小于目标串索引*/
    	while(s_pos<s_len && p_pos<size)
    	{
    		if(p_pos==-1||str[s_pos]==pstr[p_pos])
    		{
    			s_pos++;
    			p_pos++;		
    		}
    		else
    		{
    			//下面这一句出错了,和目标串的索引没有关系
    			//p_pos=next[s_pos];
    			p_pos=next[p_pos];
    		}
    	}
    	
    	if(p_pos<size-1)
    		return -1;
    	else
    		return s_pos-size;
    }
    

      

  • 相关阅读:
    c++链表实现学生成绩管理系统(简易版)
    IOS动画讲解
    栈的实现
    Masonry的使用
    二叉树详解-2
    二叉树详解-1
    CoreData的使用-2
    NSPredicate 详解
    CoreData的使用-1
    IOS常用手势用法
  • 原文地址:https://www.cnblogs.com/fistao/p/3338792.html
Copyright © 2020-2023  润新知