Leetcode题解1:最长回文子串 JAVA
题目
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
解法:动态规划算法
边界条件:1. 一个字符组成的字符串肯定是回文字符串
2. 两个相同字符组成的字符串肯定也是回文字符串
递推条件:如果α是回文串,那么aαa也是回文字符串
边界条件中我们已经得到了长度为1以及长度为2的回文字符串,然后由长度为一的回文串我们可以得到长度为三的回文串,由长度为2的回文串我们可以得到长度为4的回文串,依此类推。
实现代码如下:
class Solution {
public String longestPalindrome(String s) {
int length = s.length();
boolean[][] p = new boolean[length][length];
int st=0,ed=0,flag = 0;
for(int i = 0;i < length;i++){ // 设置边界条件,长度为1和长度为2的回文串
p[i][i]=true;
if(i+1<length&&s.charAt(i)==s.charAt(i+1)) p[i][i+1]=true;
}
for(int len = 1;len <= length-2;len++){ //递推条件,从长度为1的串向外扩展
for(int j = 1;j <= length-len-1;j++){ // 串的开始位置,从1开始
if(p[j][j+len-1]){
if(s.charAt(j-1)==s.charAt(j+len)){
p[j-1][j+len]=true;
}
}
}
}
for(int len = length;len>0;len--){ // 从长到短遍历,如果找到,则输出
for(int i = 0;i <= length-len;i++){
if(p[i][i+len-1]){
st = i;
ed = i+len;
flag = 1;
break;
}
}
if(flag ==1) break;
}
return s.equals("")?"":s.substring(st,ed);
}
}