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