5. 最长回文子串
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
代码
1、暴力求解未通过
暴力破解效率低,超时90 / 103 个通过测试用例
class Solution {
public boolean isreverse(String str){
int len = str.length();
for(int i = 0; i < len / 2; i++){
if(str.charAt(i) != str.charAt(len - i - 1)){
return false;
}
}
return true;
}
public String longestPalindrome(String s) {
String res = "";
int len = s.length();
int maxlen = 0;
for(int i = 0; i < len; i++){
for(int j = i + 1; j <= len; j++){
String subs1 = s.substring(i,j);
if(isreverse(subs1) && subs1.length() > maxlen){
res = s.substring(i,j);
maxlen = Math.max(res.length(),maxlen);
}
}
}
return res;
}
}
2、题解动态规划
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len < 2){//特殊边界
return s;
}
int start = 0,maxLen = 1;
boolean [][]dp = new boolean[len][len]; //默认是false
char[] charArray = s.toCharArray();//字符串转化为字符数组进行字符比较
//初始化
for(int i = 0; i < len; i++){//单个字符一定是回文串
dp[i][i] = true;
}
//i<=j,上三角矩阵
for(int j = 1; j < len; j++){
for(int i = 0; i < j; i++){
if(charArray[i] != charArray[j]){//头尾不等则false
dp[i][j] = false;
}
else{
if(j - i < 3){
//边界条件,即状态转移最终到单个字符(j-1)-(i+1)+1 == 1,即(j-1)-(i+1)+1 < 2即 j - i < 3
//s[i..j]长度为2或3时不必再检查子串
dp[i][j] = true;
}
else{
dp[i][j] = dp[i+1][j-1];//状态转移方程
}
}
if(dp[i][j] && j - i + 1 > maxLen){//更新回文子串长度以及其在原字符串的起始下标
maxLen = j - i + 1;
start = i;
}
}
}
return s.substring(start,start + maxLen);
}
};