最长公共子序列

动态规划+优化,双100%

思路
1、考虑从后往前推导,随着字符串的变长,两个字符串的最后一个字符相同或者不同,对最长公共子序列的长度影响。
2、使用arr[i][j]表示text1的前i个字符和text2的前j个字符的最长公共子序列长度,得到以下状态转移方程:
   若text1的第i个字符和text2的第j个字符相同,则
     arr[i][j] = arr[i - 1][j - 1] + 1;
   否则
     arr[i][j] = Math.max(arr[i][j - 1], arr[i - 1][j]);
3、考虑二维数组每次循环的时候只有最后一行数据才有作用,前面已经计算过的已无效,可以优化成一维数组。
4、考虑边界问题,可以在两个字符串前面追加“#”,防止边界越界,不要判断边界是否大于0,提升效率。

最长公共子序列_第1张图片

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int m = text1.length();
        int n = text2.length();
        m++;
        n++;
        int[] arr = new int[n];
        char[] arr1 = ("#" + text1).toCharArray();
        char[] arr2 = ("#" + text2).toCharArray();
        int temp;
        int now;
        for (int i = 1; i < m; i++) {
            temp = 0;
            for (int j = 1; j < n; j++) {
                now = arr[j];
                if (arr1[i] == arr2[j]) {
                    arr[j] = temp + 1;
                } else {
                    arr[j] = Math.max(arr[j - 1], arr[j]);
                }
                temp = now;
            }
        }
        return arr[n - 1];
    }
}

你可能感兴趣的:(算法)