leetcode 1143 最長公共子串行

2022-02-08 03:08:27 字數 1740 閱讀 8288

1143. 最長公共子串行

給定兩個字串 text1 和 text2,

返回這兩個字串的最長公共子串行的長度。

乙個字串的 子串行 是指這樣乙個新的字串:

它是由原字串在不改變字元的相對順序的情況下刪除某些字元

(也可以不刪除任何字元)後組成的新字串。

例如,"

ace" 是 "

abcde

" 的子串行,

但 "aec

" 不是 "

abcde

"的子串行。

兩個字串的「公共子串行」是這兩個字串所共同擁有的子串行。

若這兩個字串沒有公共子串行,則返回 0。

示例 1:

輸入:text1 = "

abcde

", text2 = "

ace"

輸出:3

解釋:最長公共子串行是

"ace

",它的長度為 3

。示例 2:

輸入:text1 = "

abc", text2 = "

abc"

輸出:3

解釋:最長公共子串行是

"abc

",它的長度為 3

。示例 3:

輸入:text1 = "

abc", text2 = "

def"

輸出:0

解釋:兩個字串沒有公共子串行,返回 0。

1<= text1.length <= 1000

1<= text2.length <= 1000

輸入的字串只含有小寫英文本元。

第1步: 明確 dp 陣列的含義 ******* 難度7星

dp(i,j) 表示 s1[0...i] 和 s2[0...j]中最長公共子串行的長度

第2步:定義 base case

讓索引為0的行和列表示空串,dp[0][...] 和 dp[...][0] 都應該初始化為0。

第3步:找狀態轉移方程 ******* 難度7星

1.如果 s1[i] == s2[j],說明這個公共字元一定在 lcs 中,

如果知道了 s1[0...i-1]和s2[0...j-1]中的lsc長度,再加1就是s1[0...i]和s2[0...j]中lcs的長度。

根據dp函式的定義,就是以下邏輯:

if(str1[i]==str2[j])

dp(i,j) = dp(i-1,j-1)+1;

2.如果 s1[i] != s2[j],說明s1[i]和s2[j]這兩個字元至少有乙個不在lcs中,

那到底是哪個字元不在 lcs 中呢? 我們都試一下唄。

根據dp函式的定義,就是以下邏輯:

if(str1[i]!=str2[j])

dp(i,j) = max(dp[i-1,j],dp(i,j-1));

1

class

solution

8int m =text1.size();

9int n =text2.size();

10 vectorint>> dp(m+1, vector(n+1,0

));11

for(int i=1;i<=m;++i)

1219

else

2023}24

}25return

dp[m][n];26}

27 };

先思考,再看**

LeetCode1143 最長公共子串行

題目描述 給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。乙個字串的 子串行 是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不是 abcde 的子串行。...

LeetCode 1143 最長公共子串行

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。乙個字串的 子串行 是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不是 abcde 的子串行。兩個字串的...

最長公共子串行 LeetCode 1143

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。若這兩個字串沒有公共子串行,則返回 0。乙個字串的子串行是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不...