dp,.单词的划分

有一个很长的由小写字母组成的字符串。为了便于对这个字符串进行分析,需要将它划分成若干部分,每部分称为一个单词。出于减少分析量的目的,希望划分出的单词数越少越好。  你就是来完成这一划分工作的。

Input

第1行1个字符串,长度不超过1000。
第2行1个整数nn,表示单词的个数,n100n≤100。
第3~n+2n+2行,每行列出1个单词

Output

一个整数,表示字符串可以被划分成的最少的单词数。

Samples

Input Copy
realityour
5
real
reality
it
your
our
Output
2

Source

石光中学 FCS2018基础班day7

 

 

f[i]表示这个字符串的前i个字母最少可以划分成多少个单词;

那么第一层循环以下strlen(s),指针也就是字符串中从头到尾每一个字母;

第二层循环枚举每一个单词,然后比较以下当前扫到的字符串的结尾是不是那个单词,如果是的话,那么f[i]=max(f[i],f[i-strlen(a[j])]+1);

 

#include<iostream>
#include<algorithm>
#include<cstring>
const int inf=0x3f3f3f3f;
using namespace std;
const int maxn=1e5+100;
string s;
string word[maxn];
int f[maxn];
int n;
void inint(){
    cin>>s;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>word[i];
    }
    memset(f,inf,sizeof(f));
}
int main(){
    inint();
    f[0]=0;
    for(int i=0;i<s.size();i++){
        for(int j=1;j<=n;j++){
            if(i+1>=word[j].size()){
                string z1=s.substr(i-word[j].size()+1,word[j].size()); 
                if(z1==word[j]){
                    f[i+1]=min(f[i+1],f[i-word[j].size()+1]+1);
                    //cout<<z1<<" dkl "<<word[j]<<"  "<<i+1<<"   "<<i-word[j].size()+1<<endl;
                } 
            }
        }
    }
    cout<<f[s.size()]<<endl;
}

 

posted @ 2021-01-31 22:15  lipu123  阅读(143)  评论(0编辑  收藏  举报