最長公共子串行 最長重複子串

2022-06-30 19:00:12 字數 1948 閱讀 6213

#

# 最長公共子串行 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

"print

(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 當然我們現在一眼就可以看出來最長公...