タイトル説明
2つの文字列text1とtext2が与えられた場合、これら2つの文字列の最も長い共通部分列の長さを返します。
文字列のサブシーケンスは新しい文字列を参照します。これは、文字の相対的な順序を変更せずに元の文字列から一部の文字(または文字なし)を削除することによって形成される新しい文字列です。
たとえば、
"ace" 是 "abcde" 的子序列,但 "aec" 不是
"abcde" 的子序列。两个字符串的「公共子序列」
是这两个字符串所共同拥有的子序列。
2つの文字列に共通のサブシーケンスがない場合、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
输入的字符串只含有小写英文字符。
ソース:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/longest-common-subsequence
著作権はLeetCode が所有しています。商用転載については、正式な許可書にご連絡ください。非商用転載については、出典を明記してください。
問題解決のアイデア:
DPはどうですか?タイトルには何を設定しますか?2つの文字列なので、最初の文字の最初のi文字と2番目の文字を表す2次元配列dp [i] [j]を設定します文字の最初のj文字で形成できる最長のサブシーケンス。例では、サブシーケンスが不連続になる可能性があるため、最長の肯定dp[t1.length][t2.length]
。
次に、最後のステップを見て、
1.何if t1.charAt(t1.length-1)和t2.charAt(t2.length-1)不相等;
をしますか?dp [t1.length-1-1] [t2.length-1-1]と直接等しいですか?いいえ、このサブシーケンスは不連続になる可能性があるため、絵を描きましょう。
はい不包含两者中的至少一个
、dp [i-1] [j-1]を含めませんか?これを状態遷移方程式に追加することは可能であり、正しい答えを得ることができますが、dp [i-1] [j-1]は小于等于
dp [i] [j-1]、dp [i-1]でなければならないため、必要ありません。 [j]、maxを取得することは不可能です。iとjが大きいほど、同じ回文が含まれる可能性があります。紙に描くと明らかです。私はそれを描かないのが面倒です
2.等しい場合は、直接dp [i] [j] = dp [i-1] [j-1] +1;これを十分に理解
してからコーディングする必要があります。
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
char s1[]=text1.toCharArray();
char s2[]=text2.toCharArray();
int x=s1.length;
int y=s2.length;
int dp[][]=new int[x+1][y+1];
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
if(s1[i-1]==s2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else{
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[x][y];
}
}