アイデア:
状態遷移方程式:
ダブルトラバーサルを使用して、text1の添え字iの文字がtext2の添え字jの文字と同じである場合、dp [i] [j] = dp [i-1] [j-1] +1は以前の値1を追加
それらが同じでない場合は、text1とtext2のサブシーケンスが最も一般的である場合を考えてみます。dp[i] [j] = Math.max(dp [i-1] [j]、dp [i] [j-1] )
コード:
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
int m=text1.length();
int n=text2.length();
int[][] dp=new int[m+1][n+1];
//初始化0行、0列,表示text1与空字符串text1 or text2与空字符串text1比较返回0
for(int i=0;i<=m;i++){
dp[i][0]=0;
}
for(int i=0;i<=n;i++){
dp[0][i]=0;
}
//从1开始遍历,
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(text1.charAt(i)==text2.charAt(j)){
dp[i+1][j+1]=dp[i][j]+1;
}else{
dp[i+1][j+1]=Math.max(dp[i][j+1],dp[i+1][j]);
}
}
}
return dp[m][n];
}
}
壊す:
1)境界の問題のため:
i)行0と列0は0文字を表すため、初期化中にすべての行と列0を0に設定する必要があります。
ii)dpを宣言するときにもう1つ、dp [m + 1] [n + 1]
iii)初期化するとき、境界条件はmとnに到達することです。i<= m、i <= n
iiii)トラバースするときは、text1.charAt(1)が文字列の2番目の文字を表すため、0から開始します。また、dp [1] [1]は、text1の最初の文字がtext2の2番目の文字と比較されることを意味します。
iiiii)dp [m-1] [n-1]の代わりに結果dp [m] [n]を返します。
2)ここで、dpは2番目の形式であり、現在の値は以前に計算されたすべての値に依存します
インターバル計画ですか