分析:

中间可断开

从题目中我们可以看到几个有用的量:x串的长度m,y的长度n

那么我们就可以用r[m][n]表示长度为m的串x和长度为n的串y的最长公共子序列的长度

问题一般化了就是:r[i][j]表示长度为i的串和长度为j的串的最长公共子序列的长度

然后递归地定义解就可以表示成:

而反递归的动态规划的做法就是从最短的开始

代码:

    public static int ggzc(String A, int n, String B, int m) {
        int[][] r = new int[n + 1][m + 1];
        for (int i = 0; i < n; i++) {
            r[i][0] = 0;
        }
        for (int i = 0; i < m; i++) {
            r[0][i] = 0;
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (A.charAt(i - 1) == B.charAt(j - 1)) {
                    r[i][j] = r[i - 1][j - 1] + 1;
                } else {
                    if (r[i - 1][j] > r[i][j - 1]) {
                        r[i][j] = r[i - 1][j];
                    } else {
                        r[i][j] = r[i][j - 1];
                    }
                }
            }
        }
        return r[n][m];
    }

中间不可断开:

 public static int findLongest(String A, int n, String B, int m) {
        // write code here
        int[][] r = new int[n + 1][m + 1];
        int max = 0;
        for (int i = 0; i < n; i++) {
            r[i][0] = 0;
        }
        for (int i = 0; i < m; i++) {
            r[0][i] = 0;
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (A.charAt(i - 1) == B.charAt(j - 1)) {
                    r[i][j] = r[i - 1][j - 1] + 1;
                    if (max < r[i][j]) {
                        max = r[i][j];
                    }
                }
            }
        }

        return max;
    }

results matching ""

    No results matching ""