1143. 最長公共子串行
給定兩個字串 text1 和 text2,第1步: 明確 dp 陣列的含義 ******* 難度7星返回這兩個字串的最長公共子串行的長度。
乙個字串的 子串行 是指這樣乙個新的字串:
它是由原字串在不改變字元的相對順序的情況下刪除某些字元
(也可以不刪除任何字元)後組成的新字串。
例如,"
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) 表示 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 不...