题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
动态规划
动态转移方程
如果dp[i][j]=1表示i到j是回文数,如果dp[i][j]=0,则表示i到j不是回文数。
dp[i][i]=1
if num[i]==num[i+1] dp[i][i+1]=1
if num[i+len]=num[i]
dp[i][i+len]=dp[i+1][i+len-1]
代码块
class Solution {
public String longestPalindrome(String s) {
if(s.equals("") || s.length()==0){
return s;
}
char[] num=s.toCharArray();
int[][] dp=new int[s.length()][s.length()];
int start=0;
int maxlen=1;
for(int i=0; i<s.length(); i++){
dp[i][i]=1;
if(i+1<s.length() && num[i]==num[i+1]){
dp[i][i+1]=1;
start=i;
maxlen=2;
}
}
for(int len=2;len<s.length();len++){
for(int i=0;i<s.length();i++){
if(i+len<s.length() && num[i]==num[i+len]){
dp[i][i+len]=dp[i+1][i+len-1];
if(dp[i][i+len]==1 && len+1>maxlen){
start=i;
maxlen=len+1;
}
}
}
}
return new String(num,start,maxlen);
}
}