题干:给你一个字符串 s,找到 s 中最长的回文子串。如输入"babad",则输出"aba";如输入"cbbd",则输出为“bb”。具体解析过程参考代码注释。
package learnproject.lekou;
/*
* 5.最长回文串
* 题干:给你一个字符串 s,找到 s 中最长的回文子串。
*/
public class Demo5 {
/*s = "babad"
* 1.假设字符串长度为n,当子串长度为1时,肯定是回文串
* 2.当子串长度为2时,需要判断有没有满足回文条件的子串,此时记录开始字符以及长度
* 3.当子串长度为3时,检测是否有满足回文条件的子串,以此类推
* 4.所以这里就有一个核心点就是需要定义一个二维数组dp[i][j],用来表示i到j是否是一个回文子串
* 这也造成了空间复杂度为O(n*n)
* 5.每次循环遍历结束之后就要比较下看是否和max大,如果大就要更新begin和max,即最后要截取的字符串的位置
* */
public String longestPalindrome(String s) {
char[] stringChar = s.toCharArray();
int length = stringChar.length;
if(length == 1) {
return s;
}
int max = 1;
int begin = 0;
boolean[][] dp = new boolean[length][length];
for(int l=2;l<=length;l++) {
for(int left=0;left<length;left++) {
int right = l+left-1;
if(right > length-1) {
break;
}
if(stringChar[left] != stringChar[right]) {
dp[left][right] = false;
}else {
//如果子串只有三个元素
if(right-left<3) {
dp[left][right] = true;
}else {
//如果子串的字符数大于3
dp[left][right] = dp[left+1][right-1];
}
if(dp[left][right] && right-left+1 > max) {
max = right-left+1;
begin = left;
}
}
}
}
return s.substring(begin,begin+max);
}
public static void main(String args[]) {
Demo5 demo = new Demo5();
String s = "cbbd";
System.out.println(demo.longestPalindrome(s));
}
}