中文english
給出兩個字串,找到最長公共子串行(lcs),返回lcs的長度。
樣例 1:
輸入: "abcd" and "edca"
輸出: 1
解釋:lcs 是 'a' 或 'd' 或 'c'
樣例 2:
輸入: "abcd" and "eacb"
輸出: 2
解釋:
lcs 是 "ac"
最長公共子串行的定義:
輸入測試資料 (每行乙個引數)如何理解測試資料?
第乙個版本:同向型雙指標
存在弊端,它前面匹配成功,則直接會跳到後面去匹配,按照a的字串順序在b字串進行匹配
classsolution:
""" @param a: a string
@param b: a
string
@return: the length of longest common subsequence of a and b
"""'''
存在弊端:
可能後面的匹配後面的某乙個字元會更長,他只會按照前面第乙個符合條件的即返回
'''def longestcommonsubsequence(self, a, b):
#檢測邊界
ifnot a or not b:
return
0#初始條件
l =len(a)
d = [1] *len(a)
max_num = 0
#計算順序
for i in
range(l):
j =b.find(a[i])
#邊界情況
if j != -1
: max_num =max(self.getcommonsubsequence(a[i:],b[j:],i,j),max_num)
return
max_num
def getcommonsubsequence(self,a,b,i,j):
#傳入切割後的a和b進來
p = 0
j = 0
for i in
range(len(a)):
if a[i] in
b[j:]:
p += 1
j +=b[j:].find(a[i])
return p
注:lintcode不通過,方法不可行
第二個版本:動態規劃(匹配型動態規劃)
classsolution:
""" @param a: a string
@param b: a
string
@return: the length of longest common subsequence of a and b
"""def longestcommonsubsequence(self, a, b):
# write your code here
#動態規劃,匹配型
#初始化
len1, len2 =len(a), len(b)
#存在null的情況
dp = [[0
for _ in range(len2 + 1)] for _ in range(len1 + 1
)]
#計算順序
for i in range(1,len1 + 1
):
for j in range(1, len2 + 1
): #如果兩者不相等,只需要判斷最大即可
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1
]) #如果該a和b的字元相等,則是上乙個字元加1,dp[i][j]表示的是在a的前i個字串中,匹配j的最長個數
if (a[i - 1] == b[j -1
]): #毫無疑問,這裡+1肯定是最大的,會一直更新,直到最後
dp[i][j] = dp[i - 1][j - 1] + 1
return
dp[len1][len2]
lintcode77 最長公共子串行
給出兩個字串,找到最長公共子串行 lcs 返回lcs的長度。樣例 樣例 1 輸入 abcd and edca 輸出 1 解釋 lcs 是 a 或 d 或 c 樣例 2 輸入 abcd and eacb 輸出 2 解釋 lcs 是 ac 說明最長公共子串行的定義 最長公共子串行問題是在一組序列 通常2...
最長公共子串行 最長公共子串
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 當然我們現在一眼就可以看出來最長公...