什麼是最長公共子串問題

最長公共子串(Longest Common Substring)問題是計算兩個或更多字元串中公共部分的最長字元串。例如,對於字元串 "ABCDAB" 和 "ABCDBA",它們的最長公共子串是 "ABCD"。

這個問題與最長公共子序列(Longest Common Subsequence)問題不同,後者是在不考慮順序的情況下找到公共部分的最大字元串。例如,對於字元串 "ABCDAB" 和 "ABCDBA",它們的最長公共子序列是 "ABCD",但最長公共子串是 "ABCDAB"。

最長公共子串問題可以用 Dynamic Programming 的方法來解決,時間複雜度為 O(n^2),其中 n 是字元串的長度。以下是解決這個問題的一種方法:

  1. 對於每個字元串中的每個位置 i,找到所有其他字元串中與位置 i 相對應的字元。
  2. 對於每個位置 i,找到所有其他字元串中與位置 i 相對應的字元中最長的公共子串。
  3. 返回所有找到的最長公共子串中最大的那個。

這個方法需要 O(n^2) 時間和 O(n) 空間,因為我們需要存儲每個位置的最長公共子串。如果字元串的長度已知,我們可以提前分配空間來存儲這些信息,這樣就可以避免在每次疊代中重新分配空間。