HDU - 2087 剪花布条 两种做法 KMP+循环

https://vjudge.net/problem/HDU-2087

HDU - 2087 剪花布条

题目

在这里插入图片描述

分析

在这里插入图片描述

AC代码KMP

#include<iostream>
using namespace std;
const int N=1000+10;
int n,m;
int ne[N];
string s,p;
int main()
{
	while(cin>>s)
	{
		if(s=="#") break;
		cin>>p;
		n=s.size();
		m=p.size();
		
		ne[0]=-1;
		for(int i=0,j=-1;i<=m;)
		{
			if(j==-1 || p[i]==p[j]) 
			{
				i++,j++;
				ne[i]=j;
			}
			else
				j=ne[j];
		}
		
		int ans=0;
		for(int i=0,j=0;i<=n;)
		{

			if(j<0 || s[i]==p[j])
			{
				j++; i++;
			}
			else
				j=ne[j];
				
			if(j==m)
			{
				ans++;
				j=0;  //这里不再是后退到最近的 而是从头开始 因为剪掉了就没有了 不能重复 
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

AC代码循环

#include<iostream>  
#include<string>  
using namespace std;  
int main()  
{  
    int i,j;  
    string a,b;  
    while(cin>>a)  
    {  
    	if(a=="#") break;
    	cin>>b;
    	int ans=0;
        for(i=0,j=0;i<a.size();i++)  
        {  
            if(a[i]==b[j])  
            {  
                j++;  
                if(j==b.length())//一旦出现str1,a++  
                {  
                    ans++;  
                    j=0;  
                }  
            }  
            else  
            {  
                i-=j;  
                j=0;  
            }  
        }  
        cout<<ans<<endl;  
    }  
    return 0;  
}  
posted @ 2021-07-19 17:41  斯文~  阅读(34)  评论(0)    收藏  举报

你好!