//给你一个字符串 s,找到 s 中最长的回文子串。
//
// 示例 1:
//输入:s = “babad”
//输出:“bab”
//解释:“aba” 同样是符合题意的答案。
// 示例 2:
//输入:s = “cbbd”
//输出:“bb”
// 示例 3:
//输入:s = “a”
//输出:“a”
// 示例 4:
//输入:s = “ac”
//输出:“a”
public class Test {
public static void main(String[] args) {
String s = "sddsfffgdc";
String s2 = longestPalindrome(s);
System.out.println(s2);
}
public static String longestPalindrome(String s) {
//1、定义所求的数据 ,回文串为str,
//str 如何转换为动态规划?
// 假设dp[i][j]是一个回文串(从索引i到索引j)
// 那么从索引i到索引j之间就是一个回文串,长度为nowlen + 1, nowlen = j - i
//2、找关系(上个状态是dp[i+1][j-1]),判断s.charAt(i)=s.charAt(j),就变成dp[i][j]
// dp[i][j] = dp[i+1][j-1]&&s.charAt(i)=s.charAt(j)
//3、初始值
//j-i为0,只有一个元素,比如a,j-i为1,有2个元素,比如aa
int len = s.length();
boolean[][] dp = new boolean[len][len];
int nowlen = 0 ; // 从 i 到 j
String str = ""; // 初始化回文串
for (; nowlen < len ; nowlen++) {
for (int i = 0; i + nowlen < len ; i++) {
int j = i + nowlen;
if(nowlen == 0){
dp[i][j] = true;
}else if (nowlen == 1){
dp[i][j] = (s.charAt(i) == s.charAt(j));
}else {
dp[i][j] = dp[i+1][j-1]&&(s.charAt(i) == s.charAt(j));
}
if(str.length() < j - i + 1 && dp[i][j]){
str = s.substring(i,j+1);
}
}
}
return str;
}
}
参考
最长回文子串