EOJ 1018 單詞的劃分
阿新 • • 發佈:2022-05-15
題目
有一個很長的由小寫字母組成字串。為了便於對這個字串進行分析,需要將它劃分成若干個部分,每個部分稱為一個單詞。
出於減少分析量的目的,我們希望劃分出的單詞數越少越好。你就是來完成這一劃分工作的。
輸入格式
第一行為一整數 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; } }