动态规划:回文子串的长度

    给定一个字符串,求其最长的回文子串的长度。如字符串"abcdcba"的最长回文子串长度为7,而"aebfcgdhcibja"的最长回文也是"abcdcba",长度也是7.

    分析:典型的动态规划问题,用dp[i][j]记录字符串中从字符 i 到字符 j 中最长回文子串的长度,则 

                if (s.charAt(i) == s.charAt(j)) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                } else {
                    dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);

                }

   public int longestPalindromeSubseq(String s) {
        int[][] dp = new int[s.length()][s.length()];
        for(int i = 0; i < s.length(); i++) {
        		dp[i][i] = 1;
        }
        for (int l = 1; l < s.length(); l++) { //长度从1开始
        		for (int i = 0; i + l < s.length(); i++) {
        			int j = i + l;
        			if (s.charAt(i) == s.charAt(j)) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                } else {
                    dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[0][s.length()-1];
    }

    或者从后往前循环:

    public int longestPalindromeSubseq(String s) {
        int[][] dp = new int[s.length()][s.length()];
        
        for (int i = s.length() - 1; i >= 0; i--) {
            dp[i][i] = 1;
            for (int j = i+1; j < s.length(); j++) {
                if (s.charAt(i) == s.charAt(j)) {
                    dp[i][j] = dp[i+1][j-1] + 2;
                } else {
                    dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
                }
            }
        }
        return dp[0][s.length()-1];
    }

猜你喜欢

转载自blog.csdn.net/xiezongsheng1990/article/details/80085170