• hdu 2078 水题 kmp 计算str1中有几个str2


    kmp是从最初的字符串匹配算法优化而来的,其中就是多了一个函数值函数,记录最后

    的匹配的,从而得到优化,有回溯的感觉。只是对kmp的函数值函数求法有的不理解

    #include <iostream>
    #include <cstdio>
    #include <string.h>
    using namespace std;
    
    int n[1000];
    char str1[1000];
    char str2[1000];
    int sum;
    
    void kmp(char *p,int next[])
    {
    	int i;
    
    	int j=0;
    	int k=-1;
    	next[0]=-1;
    
    	while(p[j]!='\0')
    	{		
    		if(k==-1||p[j]==p[k])
    		{
    			j++;
    			k++;
    
    			if(p[j]!=p[k])
    				next[j]=k;
    			else
    				next[j]=next[k];
    
    		}else
    		{
    			k=next[k];
    		}
    	}
    
    	//for(i=0;i<j;i++)
    		//printf("%d ",next[i]);
    	//printf("\n");
    }
    
    void makekmp()
    {
    	int i,j;
    
    	int len1=strlen(str1);
    	int len2=strlen(str2);
    
    	//printf("%d%d\n",len1,len2);
    
    	for(i=0,j=0;i<len1;i++)
    	{
    		while(str1[i]==str2[j])
    		{
    			if(j==len2)
    				break;
    			i++;
    			j++;
    		}
    		if(j==len2)
    		{
    			j=0;
    			i--;
    			sum++;
    		}else
    		{
    			if(n[j]!=-1)
    				j=n[j];
    			else
    				j=0;
    		}
    	
    		//printf("fz1:%d %d %d %d\n",len1,len2,i,j);
    	}
    	printf("%d\n",sum);
    }
    
    int main()
    {
    	while(cin>>str1[0],str1[0]!='#')
    	{
    		//printf("%c\n",str1[0]);
    
    		scanf("%s%s",&str1[1],&str2);
    
    		kmp(str2,n);
    
    		sum=0;
    
    		makekmp();
    	}
    
    	return 0;
    }
    

      

  • 相关阅读:
    5. Longest Palindromic Substring
    56. Merge Intervals
    386. Lexicographical Numbers
    42. Trapping Rain Water
    *[topcoder]BracketExpressions
    [codility]CountDiv
    *[codility]MinAvgTwoSlice
    *[codility]MissingInteger
    [mock]7月25日
    网络广告术语
  • 原文地址:https://www.cnblogs.com/jackes/p/2432229.html
Copyright © 2020-2023  润新知