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;
}
}

浙公网安备 33010602011771号