《算法笔记》12.2小节——字符串专题->KMP算法 问题 C: 剪花布条

题目描述

一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?

输入

输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。

输出

输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。

样例输入
abcde a3
aaaaaa  aa
#
样例输出
0
3

 分析:注意这道题的这种样例:aabcbc abc,答案应该输出 2.

可以用 stl 的 find 查找模式串在文本串中第一次出现的位置,然后再用 erase 把这一部分的模式串删除,继续 find,直到找不到模式串为止。

#include
#include 
#include  
#include  
#include   
#include   
#include   
#include    
#include    
#include    
#include    
#include      
#include      
#define INF 0x3fffffff
#define db1(x) cout<<#x<<"="<<(x)<>text,text[0]!='#')
    {
        cin>>pattern;
        int ans=0;
        while(text.length()>=pattern.length())
        {
            if (text.find(pattern)!=string::npos)
            {
                ans++;
                text.erase(text.find(pattern),pattern.length());
            }
            else break;
        }
        printf("%d\n",ans);
    }
 
    #ifdef test
    clockid_t end=clock();
    double endtime=(double)(end-start)/CLOCKS_PER_SEC;
    printf("\n\n\n\n\n");
    cout<<"Total time:"<

你可能感兴趣的:(《算法笔记》,算法)