日期: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;
}
沒有留言:
張貼留言