LeetCode 1143 最長公共子串行

2022-08-11 20:03:11 字數 1145 閱讀 7941

給定兩個字串 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[i][j] 來儲存狀態,表示text1的前i個字元與text2的前j個字元的最長公共子串行。那麼它的值應當有如下情況。

如果text1的第i個字元與text2的第j個字元相同,那麼dp[i][j] = dp[i-1][j-1] + 1

如果text1的第i個字元與text2的第j個字元不同,那麼dp[i][j] = max(dp[i-1][j] , dp[i][j-1]). 因為已經知道第i個和第j個完全不同了,所以不用讓它們都往前走了,只讓text2走到j,或者只讓text1走到i,就足夠了。然後比較哪種結果最大,因為求的是最長公共子串行嘛,所以取最大值。

狀態的轉變就是這樣,要注意的是,因為下標會取到dp[i-1][j-1],所以在迴圈時要從1開始,而不是0.

c++**如下:

1

class

solution 10}

11return

dp.back().back(); 12}

13 };

LeetCode1143 最長公共子串行

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

LeetCode 1143 最長公共子串行

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

最長公共子串行 LeetCode 1143

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