• 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;
    }
  • 相关阅读:
    小程序左滑删除之<movable-area/>实现
    小程序省市区县分割
    小程序自定义底部按钮适配Iphone X
    小程序处理图片加载失败的问题
    Notepad++ 使用技巧
    IDEA 在打包项目时遇到的ERROR
    Markdown学习
    Ubuntu操作系统(文件传输)
    数据 恢复----判断Raid盘序及校验方向
    数据恢复----重组raid5解析
  • 原文地址:https://www.cnblogs.com/lipu123/p/14354387.html
Copyright © 2020-2023  润新知