EOJ 1018 单词的划分

题目

有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词。

出于减少分析量的目的,我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。

输入格式

第一行为一整数 T,表示有 T 组测试数据。

每组测试数据第一行为一字符串。(长度小于 256)

第二行为一整数 N。(1<=N<=100)

以下 N 行,每行一个单词,每个单词长度小于 128。

输出格式

每组测试数据占一行 , 这一行只有一个整数,表示字符串可以被划分成的最少的单词数。我们保证单词是可划分的。

样例

1
realityour
5
real
reality
it
your
our

output

2

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int n, f[257];
string s, a[257];
//状态转移方程:f[i]=min(f[i],f[i-a[j].size()]+1)
//用一个数组f[i]来记录前i长度的母串可以由最少的单词构成
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        memset(f, 1, sizeof(f));
        f[0] = 0; 
        cin >> s >> n;
        for (int i = 1; i <= n; i++)
            cin >> a[i];//输入各字符串

        for (int i = 0; i < s.size(); i++)
            for (int j = 1; j <= n; j++)//遍历字符串
                if (a[j].size() <= i + 1)
                    if (s.substr(i + 1 - a[j].size(), a[j].size()) == a[j])//尾字符匹配
                        f[i + 1] = min(f[i + 1], f[i + 1 - a[j].size()] + 1);
        cout << f[s.size()]<<endl;
    }
}

posted @ 2022-05-15 19:13  渣渣纸  阅读(76)  评论(0)    收藏  举报