1. 程式人生 > 其它 >EOJ 1018 單詞的劃分

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