[DP题解] 最长回文字符串问题
【问题】输入一个字符串,求出其中最长的回文子串。 子串的含义是:在原串中连续出现的字符串片段。回文的含义是:子串从左向右看和从右向左看是相同的,例如:abba,yyxyy。 在判断时忽略所有标点符号和空格,且忽略大小写,但是输出应保持原样。输入字符串的长度不超过5000,且占据单独一行。 应该输出最长的回文串。如果有多个,输出起始位置最靠左的一个。
[算法设计]
/*
* 动态规划算法 dp(i, j) represents whether s(i ... j) can form a palindromic
* substring, dp(i, j) is true when s(i) equals to s(j) and s(i+1 ... j-1) is a
* palindromic substring. When we found a palindrome, check if it’s the longest
* one.
*/
public static String longestPalindrome(String s) {
// n表示字符串的长度
int n = s.length();
String res = null;
// 定义一个dp数组
boolean[][] dp = new boolean[n][n];
// 外层循环控制从最后一个字符向第一个字符渐进
for (int i = n - 1; i >= 0; i--) {
// 内层循环控制
for (int j = i; j < n; j++) {
// dp数组元素
dp[i][j] = s.charAt(i) == s.charAt(j) && (j -