題目敘述

我們說字串 $A$ 是字串 $B$ 的Prefix(前綴字串),若且唯若字串 $B$ 的前 $len(A)$ 個字母與 $A$ 完全相同,其中 $len(A)$ 指的是字串 $A$ 的長度。例如: “Exam” 和 “Example”都是 “Example” 的 Prefix,但是 “Ample”和 “Exapple” 都不是 “Example” 的 Prefix。同樣的,當 $B$ 的後 $len(A)$ 個字母與 $A$ 完全相同的時候,我們稱 $A$ 是 $B$ 的 Suffix (後綴字串)。給定兩個字串 $P$, $Q$,請你找出最長的字串 $S$ 使得 $S$ 是 $P$ 的 Prefix,同時也是 $Q$ 的 Suffix。

輸入說明

兩個字串 $P$, $Q$ 各佔一行,只包含小寫英文字母,長度皆不超過 1000 字元。

輸出說明

輸出最長的字串 $S$ 的長度 $len(S)$。

Sample Input

example
exam

Sample Output

4

出處

95建中資訊培訓模擬試題一(Prob 2)

OJ連結


題解

注意到輸入的字串長度不超過 1000 個字元,所以我們只要逐一枚舉所有第一個字串的 prefix,看看它是不是第二個字串的 suffix 就好了~

要取出子字串,可以利用 C++ 的 <string> 函式庫。

/* by tmt514 */
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;

int main() {
    string P, Q;
    cin >> P >> Q;
    int ans = min(P.size(), Q.size());
    while (ans > 0 && (P.substr(0, ans) != Q.substr(Q.size()-ans)))
        --ans;
    cout << ans << endl;
    return 0;
}

關於這題

這題顯然是個字串匹配的問題,而且是 KMP 演算法的直接應用。但是根據輸入規模,找出能夠通過測試的最單純演算法,才是取得先機的關鍵。

本文由卡恩(tmt514)撰寫。 本站使用 GasbyJS 搭配 Bulma 製作,其原始碼為 MIT 授權。 網站內容除了題源以外,若無特別說明皆為創用 CC-BY-NC-SA 4.0 授權。 題源部份若有版權爭議還請與我聯繫,感恩。