题目:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
解答:
典型动态规划问题。
用boolean数组isPalin[][],isPalin[i][j] == true,表示,s[i].....s[j]是回文字符串;
动态方程是:
(1)isPalin[i][j] <---- isPalin[i+1][j-1] && s[i] == s[j] (j>i+1)
(2)isPalin[i][j] <--- s[i] == s[j] (j == i+1)
从长度为1的字符串开始遍历,并将结果存储供后面使用。
代码:
public class Solution {
public String longestPalindrome(String s) {
boolean[][] isPalin = new boolean[s.length()][s.length()];
char[] chars = s.toCharArray();
int len = chars.length;
int beginIndex = 0, maxLength = 1;
if(s.length() < 2) return s;
// length is 1
for (int i = 0; i < chars.length; i++)
isPalin[i][i] = true;
// length is 2
for (int i = 0; i < len - 1; i++) {
if (chars[i] == chars[i + 1]) {
isPalin[i][i + 1] = true;
beginIndex = i;
maxLength = 2;
}
}
// length >= 3
for (int length = 3; length <= len; length++) {
for (int i = 0; i < len - length + 1; i++) {
int j = i + length - 1;
if (chars[i] == chars[j] && isPalin[i + 1][j - 1]) {
isPalin[i][j] = true;
beginIndex = i;
maxLength = length;
}
}
}
return s.substring(beginIndex, beginIndex + maxLength);
}
}