zoukankan      html  css  js  c++  java
  • 再解 KMP(初学)

     SDIBT 2696   KMP模式匹配 一(串)

     

    Description

    求子串的next值,用next数组存放,全部输出

    Input

    输入一个字符串

    Output

    输出所有next值

    Sample Input

    abaabcac

    Sample Output

    0 1 1 2 2 3 1 2

     

    #include<cstring>
    #include<iostream>
    using namespace std;
    int main ()
    {
    	int next[2000];
    	char p[2000];
        int j,k;
        next[0]=-1;
        j=0;
        k=-1;
    	cin>>p;
    	int	len=strlen(p);
        while(j<len-1){
            if(k==-1||p[j]==p[k]){   //匹配的情况下,p[j]==p[k]
                j++;
                k++;
                next[j]=k;
            }
            else                   //p[j]!=p[k]
                k=next[k];
        }
    	int i;
    	for(i=0;i<len-1;i++)
    		cout<<next[i]+1<<' ';
    	cout<<next[i]+1;
    	return 0;
    }
    

    next数组产生过程辅助理解:

    #include<cstring>
    #include<iostream>
    using namespace std;
    int main ()
    {
    	while(1){
    	int next[2000];
    	char p[2000];
        int j,k;
        next[0]=-1;
        j=0;
        k=-1;
        cout<<"输入为:"; 
    	cin>>p;
    	int	len=strlen(p);
    	cout<<endl<<"执行过程:"<<endl; 
        while(j<len-1)//len-1是因为后面有个j++ 
        {
            if(k==-1||p[j]==p[k])    //匹配的情况下,p[j]==p[k]
            {
            	cout<<"进入if语句:"<<endl;
                j++;  //递推因子只在这里加 
                cout<<"j++="<<j<<endl; 
                k++;
                cout<<"k++="<<k<<endl; 
                next[j]=k;
                cout<<"next["<<j<<"]="<<k<<endl<<endl;
            }
            else {          //p[j]!=p[k]
             cout<<"进入else语句:"<<endl;
    		 int temp=k;                
                k=next[k];
                cout<<"k="<<next[temp]<<endl<<endl; 
    			}
        }
        cout<<"获得的next数组为:"<<endl;
    	int i;
    	for(i=0;i<len-1;i++) //len-1是因为后面有个 
    		cout<<next[i]<<' ';
    	cout<<next[i]<<endl;
    		} 
    	return 0;
    }
    

    运行情况:

     

     

    最后实例结合:http://blog.csdn.net/u014665013/article/details/38985621  


    SDIBT 2697  KMP模式匹配 二(串)

    Description

    输入一个主串和一个子串,用KMP进行匹配,问进行几趟匹配才成功,若没成功,则输出0

    Input

    输入一个主串和一个子串

    Output

    匹配的趟数

    Sample Input

    ababcabcacbab
    abcac
    

    Sample Output

    3

     

    #include<iostream>
    #include<string>
    #include<cstring>
    using namespace std;
    const int maxsize=100;
    void getnext(string t,int next[])//此处也可以将int next[]改写成  int* next[]
    {
    	int j,k;
    	j=0; k=-1; next[0]=-1;
    	while(j<t.length()-1){
    		if(k==-1 ||t[j]==t[k]){
    			j++;k++;
    			next[j]=k;
    		}
    		else k=next[k];
    	}
    }
    int kmpindex(string s,string t)//s为目标串(主串),t为模式串
    {
    	int next[maxsize],i=0,j=0;
    	//memset(next,-1,sizeof(next));
    	getnext(t,next);
    	int m=0;
    	m++;
    	int s_len=s.length(),t_len=t.length();//此处注意返回值得问题,详见:<a target=_blank href="http://blog.csdn.net/u014665013/article/details/38292717">http://blog.csdn.net/u014665013/article/details/38292717</a>
    	while(i<s_len && j<t_len){	
    		if(j==-1 ||s[i]==t[j]){
    			i++;
    			j++;
    		}
    		else
    		 j=next[j],m++;
    	}
    
    	if(j>=int(t.length() ))
           		return m;
    	else
    		return 0;
    }
    
    int main()
    {
    	string a;
    	string b;
    	cin>>a;
    	cin>>b;
    	cout<<kmpindex(a,b)<<endl;
    
    	return 0;
    }


     

    SDIBT 2698  KMP模式匹配 三(串)

    Description

    输入一个主串和一个子串,若匹配成功,则找出匹配的趟数和在子串在主串中的位置,若匹配不成功,则输出0

    Input

    输入两个字符串

    Output

    输出匹配的趟数和位置

    Sample Input

    ababcabcacbab
    abcac

    Sample Output

    3 6
    #include<iostream>
    #include<string>
    #include<cstring>
    using namespace std;
    const int maxsize=100;
    void getnext(string t,int next[])
    {
    	int j,k;
    	j=0; k=-1; next[0]=-1;
    	while(j<t.length()-1){
    		if(k==-1 ||t[j]==t[k]){
    			j++;k++;
    			next[j]=k;
    		}
    		else k=next[k];
    	}
    }
    void kmpindex(string s,string t)
    {
    	int next[maxsize],i=0,j=0;
    	memset(next,-1,sizeof(next));
    	getnext(t,next);
    	int m=0;
    	m++;
    	while(i<s.length() &&j<int(t.length())){		
    		if(j==-1 ||s[i]==t[j]){
    			i++;
    			j++;
    		}
    		else j=next[j],m++;
    	}
    
    	if(j>=int(t.length() ))
           		cout<<m<<' '<<(i-t.length())+1<<endl;;
    	else
    		cout<<0<<endl;
    }
    
    int main()
    {
    	string a;
    	string b;
    	cin>>a;
    	cin>>b;
    	kmpindex(a,b);
    
    	return 0;
    }
    


     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


    
  • 相关阅读:
    httpd-2.2 配置及用法完全攻略
    在 Ubuntu 16.04 上安装 LEMP 环境之图文向导
    Zookeeper集群搭建
    smem – Linux 内存监视软件
    X.Org可能将失去它的域名x.org
    Docker 容器测试全探索
    Unix操作系统中UUCP知识详细讲解
    常用的Git Tips
    Unix操作系统中UUCP知识详细讲解
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/zswbky/p/5432087.html
Copyright © 2011-2022 走看看