Leetcode[1143].最长公共子序列

思路(动态规划)

  1.首先,定义一个二维数组来存储这两个字符串各个位置前的最长公共子序列。例如:result[i][j]表示text1前i个字符与text2前j个字符的最长公共子序列。

    2.确定result[i][j]的值。result[i][j]的值取决于text1.charAt(i)与text2charAt(j)是否相等:

    如果text1.charAt( i ) == text2.charAt( j )result[ i ][ j ]result[ i - 1 ][ j - 1 ] + 1。

    如果text1.charAt( i ) != text2.charAt( j ),此时,最长公共子序列为text1前i - 1个字符与text2前j个字符的最长公共子序列,或者为text1前i个字符与text2前j - 1个字符的最长公共子序列

    即,result[ i ][ j ] = Math.max(result[ i ][ j - 1 ] ,result[ i - 1 ][ j ]

    综上所述,可以得到最长公共子序列的状态转移方程:

          result[ i ][ j ] = result[ i - 1 ][ j - 1 ] + 1, ( text1.charAt( i ) == text2.charAt( j ) )

          result[ i ][ j ] = Math.max(result[ i ][ j - 1 ] ,result[ i - 1 ][ j ] ),( text1.charAt( i ) != text2.charAt( j ) )

    注意:动态规划问题一定要明确状态转移方程!!

代码

 

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int m = text1.length(), n = text2.length();
        int[][] result = new int[m + 1][n + 1];
        for(int i = 1;i <= m;i++){
            for(int j = 1;j <= n;j++){
                if(text1.charAt(i - 1) == text2.charAt(j - 1)){
                    result[i][j] = result[i - 1][j - 1] + 1;
                }else{
                     result[i][j] = Math.max(result[i][j - 1], result[i - 1][j]);
                }
            }
        }
        return result[m][n];
    }
}

 

posted @ 2021-03-29 21:12  yfy刷题  阅读(66)  评论(0)    收藏  举报