Description
5. 最长回文子串
难度中等3028
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
Solution
暴力解
class Solution {public String longestPalindrome(String s) {if (s.length() < 2){return s;}char[] cs = s.toCharArray();int start = 0, maxLen = 1;for (int i = 0; i < cs.length - 1; i ++){ // 分别已 cs[i] 为字符串起点for (int j = i + 1; j < cs.length; j ++){ // cs[j] 为字符串结尾if (!validate(cs, i, j)){ //判断是否是 cs[i] ~ cs[j] 的字符串是否是回文串continue;}if (maxLen < (j - i + 1)){start = i;maxLen = j - i + 1;}}}return s.substring(start, start+maxLen);}// 判断字符串是否是回文串private boolean validate(char[] cs, int left ,int right){while (left < right){if (cs[left] != cs[right]){return false;}left ++;right --;}return true;}}
动态规划
class Solution {public String longestPalindrome(String s) {if (s.length() < 2) return s;int len = s.length();char[] cs = s.toCharArray();boolean[][] dp = new boolean[len][len];// 状态初始化,单个字符为回文串for (int i = 0; i < len; i ++){dp[i][i] = true;}// i:字符串起点,j:字符串结尾int start = 0, maxLen = 1;for (int j = 0; j < len; j ++){for(int i = 0; i < len; i ++){if ( i >= j )break;if (cs[i] != cs[j]){ // 首尾字符不相同dp[i][j] = false;continue;}// 首尾字符相同的情况int substrlen = j - i + 1;if (substrlen == 2){ // 长度等于2的情况,此时是回文串,如 aadp[i][j] = true;}else{ // 长度大于2的情况,此时判断子串 cs[i+1] ~ cs[j-1] 是不是回文串dp[i][j] = dp[i+1][j-1];}// 记录最大的回文子串if (dp[i][j] && substrlen > maxLen){maxLen = substrlen;start = i;}}}return s.substring(start, start + maxLen);}}
