1143.最長共通部分列(中)

アイデア:

状態遷移方程式:

ダブルトラバーサルを使用して、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番目の形式であり、現在の値は以前に計算されたすべての値に依存します

インターバル計画ですか

おすすめ

転載: blog.csdn.net/di_ko/article/details/115262012