最長公共子串
最長公共子串(Longest Common Substring)問題是計算兩個或更多字元串中共同的、最長的子串。例如,對於字元串 "ABCDAB" 和 "ABCDBA",它們的最長公共子串是 "ABCD"。
這個問題可以用動態規劃(Dynamic Programming)來解決。我們可以定義一個矩陣 L[i][j],表示字元串 S[0..i-1] 和 S[0..j-1] 的最長公共子串長度。那麼 L[i][j] 的值可以通過以下規則來計算:
如果 S[i-1] == S[j-1],則 L[i][j] = L[i-1][j-1] + 1; 如果 S[i-1] != S[j-1],則 L[i][j] = 0。
初始條件是 L[0][0] = 0 和 L[0][j] = L[i][0] = 0。
最後,我們找到 L 矩陣中最大的值,那就是我們要找的最長公共子串的長度。
以下是一個簡單的 Python 實現:
def lcs(s1, s2):
m, n = len(s1), len(s2)
L = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m):
for j in range(n):
if s1[i] == s2[j]:
L[i + 1][j + 1] = L[i][j] + 1
else:
L[i + 1][j + 1] = 0
return L[m][n]
s1 = "ABCDAB"
s2 = "ABCDBA"
print(lcs(s1, s2)) # 輸出應該是4,因為最長的公共子串是"ABCD"
這個算法的時間複雜度是 O(mn),其中 m 和 n 分別是兩個字元串的長度。空間複雜度也是 O(mn),因為我們使用了 m*n 的矩陣。
如果你只需要最長公共子串的長度,上面的算法就足夠了。但如果你需要實際的子串,你可以使用回溯(backtracking)來找到它。