5. 最长回文子串
5. 最长回文子串
package 动态规划; public class 最长回文子串 { public static void main(String[] args) { String s = "aaaa"; 最长回文子串 o = new 最长回文子串(); System.out.println(o.longestPalindrome(s)); } // 动态规划解法 // 定义状态:dp[i][j]表示从i到j字符是回文串 // 设置初始状态: j-i=0时候dp[i][j]=1,j-i=i时,若c[i]==c[j]时候dp[i][j]=1 // 状态转移方程:dp[i+1][j-1]=1 && c[i]==c[j] 时候,dp[i][j]=1 public String longestPalindrome(String s) { if (s == null || s.length() == 0 || s.length() == 1) { return s; } char[] c = s.toCharArray(); int[][] dps = new int[s.length()][s.length()]; int maxLength = 0; int start = 0; // 之所以先确定j的值在确定i的值,是因为二维数组的表格填表顺序决定的 // 只有确定了上一个元素的值,才能推下一个元素的值 for (int j = 0; j < dps.length; j++) { for (int i = 0; i < j; i++) { if ((j - i) <= 2) { if (c[i] == c[j]) { dps[i][j] = 1; } } else { if (dps[i + 1][j - 1] == 1 && c[i] == c[j]) { dps[i][j] = 1; } } if (dps[i][j] == 1) { if (j - i + 1 > maxLength) { maxLength = j - i + 1; start = i; } } } } return s.substring(start, start + maxLength); } }
..