每日一题:最长回文子串

142 阅读1分钟

题目描述

题目链接

思路

方法一:动态规划

首先要明白子串就是指连续的子序列。用s(i,j)表示下标i,j之间的子串,如果s(i,j)是回文串,那么由对称性必然可以得出s(i+1,j-1)也是回文串。当用dp[i][j]表示下标i,j间的子串是否是回文子串,则可以得出推导公式:dp[i][j] = dp[i+1][j-1] && (s[i] == s[j]);(j-i > 1)

java版本

class Solution {
    public String longestPalindrome(String s) {
        int _size = s.length();
        boolean dp[][] = new boolean[_size][_size];
        int max = 0;
        int pos = 0;
        String ans = "";
        for (int l = 0;l < _size; l ++) {
            for (int i = 0;i + l < _size;i ++) {
                int j = i + l;
                char a = s.charAt(i);
                char b = s.charAt(j);
                if (l == 0) {
                    dp[i][j] = true;
                }
                else if (l == 1) {
                    dp[i][j] = (a == b);
                }
                else {
                    dp[i][j] = (a==b) && dp[i+1][j-1];
                }
                if (dp[i][j]) {
                    ans = s.substring(i, j+1);
                }
            }
        }
        return ans;
    }
}

JavaScript版本

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    let map = new Array(s.length);
    for(i = 0;i < s.length;i ++){
        map[i] = [];
        for (j = 0;j < s.length;j ++) {
            map[i].push(false);
        }
    }
    ans = "";
    for(let l = 0;l < s.length;l ++ ) {
        for (let i = 0;i + l < s.length;i ++) {
            let j = i+l;
            if(l == 0) {
                map[i][j] = true;
            }
            else if(l == 1) {
                map[i][j] = (s[i]==s[j]);
            }
            else {
                map[i][j] = map[i+1][j-1] && (s[i] == s[j]);
            }
            if (map[i][j]) {
                ans = s.substring(i,j+1) 
            }
        }
    }
    return ans;
};