leetcode 1143最長公共子串行 LCS

2021-10-10 19:47:30 字數 1276 閱讀 3710

給定兩個字串 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

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

分析:本題是經典的動態規劃方法,首先建立乙個dp二維陣列,設串1的長度為m,串2的長度為n,則建立乙個dp[m+1][n+1],text1 = 「abc」, text2 = 「abc」,對於該例子dp[0][3],表示""和"abc"的最長公共子串行,很明顯為0,因為第乙個是空串,這裡就是base case,對於i=0或者j=0的情況,全部初始化為0。

對於dp[i][j]的值,如果s[i]和t[j]相等,那麼其dp[i][j] 就等於dp[i-1][j-1] +1 ,如果不相等 ,那麼說明s[i]和s[j]這兩個字元一定有乙個不在lcs中,因此我們可以分別去掉乙個取較大值,max(dp[i-1][j],dp[i][j-1]),有人可能有疑問,為什麼不多加乙個dp[i-1][j-1]呢?加上其實是沒錯的,其實沒必要加上,因為dp[i-1][j-1]一定是小於等於dp[i-1][j],dp[i][j-1]的。

經過上面分析,**如下

class

solution

for(

int i =

0; i < l1;i++

)for

(int i =

0;i < l1;i++

)else}}

return dp[l1]

[l2];}

}

LeetCode1143 最長公共子串行

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

LeetCode 1143 最長公共子串行

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

最長公共子串行 LeetCode 1143

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