## 最長公共子串行 longest common subsquence
#s1 = "a b d a c e"
#s2 = "b a b c e"
#lcs = ["abce", "abce"]
#長度4
## 1 brute force
## 遞迴解法 從單個字元解決問題 某位置處若兩字元相等,則同時序號增加,最長長度+1
## 若不相等,則需要s1增加1個位置,或者s2增加乙個位置,哪個大返回哪個。
deflcs_brute_force(s1, s2):
deflcs_recursion(i, j):
if i >= len(s1) or j >=len(s2):
return
0
elif s1[i] ==s2[j]:
return 1 + lcs_recursion(i + 1, j + 1)
else
:
return max(lcs_recursion(i + 1, j), lcs_recursion(i, j + 1))
return
lcs_recursion(0, 0)
s1 = "
abdace
"s2 = "
babce
(lcs_brute_force(s1, s2))
## 遞迴演算法的時間複雜度是指數級的,因為會重複計算,重複遞迴。解決辦法是借助乙個二位陣列,記錄已經算出來的lcs,
## 下次根據i和j直接去表裡查。這樣下來時間複雜度和空間複雜度都是o(m*n)
## 遞迴演算法是bottum自底向上回溯
#########動態規劃#################
#思路是利用乙個二位陣列(矩陣),正向計算,不用遞迴到底再回溯,
#它每次都把算出來的值記錄再矩陣裡,計算下乙個的時候直接查表
#先初始化乙個二位陣列用來儲存每一步計算出的lcs
尋找子串行內容,從矩陣最後乙個元素往回回溯就行。
最長重複子串
同樣使用動態規劃,畫乙個矩陣用來儲存每一步的結果。與最長公共子串行相比甚至還簡單一些。
最長重複子串,最長公共子串行, 最長公共子串
原題 首先這是乙個單字串問題。子字串r 在字串l 中至少出現兩次,則稱r 是l 的重複子串。重複子串又分為可重疊重複子串和不可重疊重複子串,這裡只是簡單討論最長可重疊的重複子串,給出基本演算法。最長重複子串 用最笨的方法,逐個掃瞄,時間複雜度o n 2 如下,親測可用 int lcs comlen ...
最長公共子串行 最長公共子串
1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...
最長公共子串行 最長公共子串
1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...