熱門文章

2026年1月21日 星期三

ZeroJudge 解題筆記:c001. 10405 - Longest Common Subsequence

作者:王一哲
日期:2026年1月21日


ZeroJudge 題目連結:c001. 10405 - Longest Common Subsequence

解題想法


只要找最長共同子序列 (longest common subsequence, LCS) 的長度,用二維串列 dp 儲存兩個字串 s, t 的第 i 個、第 j 個字母對應的 LCS 長度。

Python 程式碼


使用時間約為 24 ms,記憶體約為 3 MB,通過測試。
import sys

def length_LCS(s, t):
    m, n = len(s), len(t)
    dp = [[0]*(n+1) for _ in range(m+1)]
    for i in range(1, m+1):
        for j in range(1, n+1):
            if s[i-1] == t[j-1]:
                dp[i][j] = dp[i-1][j-1] + 1
            else:
                dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    return dp[m][n]

result = []
lines = sys.stdin.readlines()
idx = 0
while idx < len(lines):
    if not lines[idx].strip():
        idx += 1
        continue
    a = lines[idx].strip()
    idx += 1
    b = lines[idx].strip()
    idx += 1
    ans = length_LCS(a, b)
    result.append(f"{ans:d}\n")
sys.stdout.write("".join(result))

使用時間約為 22 ms,記憶體約為 2.9 MB,通過測試。
import sys

def length_LCS(s, t):
    m, n = len(s), len(t)
    dp = [[0]*(n+1) for _ in range(m+1)]
    for i in range(1, m+1):
        for j in range(1, n+1):
            if s[i-1] == t[j-1]:
                dp[i][j] = dp[i-1][j-1] + 1
            else:
                dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    return dp[m][n]

result = []
lines = iter(sys.stdin.read().split())
idx = 0
while True:
    a = next(lines, None)
    b = next(lines, None)
    if a is None or b is None: break
    ans = length_LCS(a, b)
    result.append(f"{ans:d}\n")
sys.stdout.write("".join(result))


C++ 程式碼


使用時間約為 1 ms,記憶體約為 364 kB,通過測試。
#include <iostream>
#include <vector>
using namespace std;

int length_LCS(string s, string t) {
    int m = (int)s.size(), n = (int)t.size();
    vector<vector<int>> dp (m+1, vector<int> (n+1, 0));
    for(int i=1; i<=m; i++) {
        for(int j=1; j<=n; j++) {
            if (s[i-1] == t[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
            } else {
                if (dp[i-1][j] > dp[i][j-1]) dp[i][j] = dp[i-1][j];
                else dp[i][j] = dp[i][j-1];
            }
        }
    }
    return dp[m][n];
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    string s, t;
    while(cin >> s >> t) cout << length_LCS(s, t) << "\n";
    return 0;
}


沒有留言:

張貼留言