给你一个字符串 s,找到 s 中最长的
回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
原题如上:
根据官方题解,代码及代码解析如下:
package t5;
public class huiwen {
public static void main(String[] args) {
//利用动态规划的思想
String s = "abcbba";
int len = s.length();//记录s的长度
if (len < 2){
System.out.println("s");//当s的长度为0或1,则没有任何意义,就直接输出s
}
else {//长度符合标准继续向下执行
int maxlen = 1;//记录最长回文子串的长度
int begin = 0;//记录起始下标
char[] charArray = s.toCharArray();//将字符串转化为字符数组
//初始化二维表格
//dp[i][j]的值表示s[i...j]是否是回文串
boolean[][] dp = new boolean[len][len];
for (int i = 0; i < len; i++) {
dp[i][i] = true;//将对角线全部赋值为true
}
//先一列一列填,先填左下角,枚举j,j是第二个数,所以从1开始枚举
for (int j = 1; j < len; j++) {
for (int i = 0; i < j; i++) {//对角线上已经有值了,所以i只需要遍历到j-1就行
if (charArray[i] != charArray[j]){
dp[i][j] = false;//当头尾字符不一致时,就不用继续向下比较了,直接赋值false
}else {//头尾字符一致
if (j - i < 3){//头尾去掉之后,没有字符或者只剩下一个字符时,也可直接判断是回文串
dp[i][j] = true;
}else {
dp[i][j] = dp[i+1][j-1];//状态转移
}
}
//记录回文长度和起始位置
if (dp[i][j] && (j - i +1 > maxlen)){//保证dp[i][j]是回文,并且比之前长度更长
maxlen = j - i +1;//修改长度值
begin = i;//修改初始位置
}
}
}
System.out.println(s.substring(begin,begin+maxlen));//输出结果
}
}
}
运行结果如下: