5. 最长回文子串
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "a"
输出:"a"
示例 4:
输入:s = "ac"
输出:"a"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母(大写和/或小写)组成
作答
===========================================================================
- 暴力解法,复杂度O(N³)
// 暴力解法,复杂度O(N³)
class Solution {
public String longestPalindrome(String s) {
if(s.length() < 1){
return "0";
}
// 因为要取子串,先转为数组
char[] arr = s.toCharArray();
// 记录最长子串长度,至少会是1
int maxLen = 1;
// 记录最长子串起始位置
int begin = 0;
// 遍历所有长度大于等于2的子串,记录最长子串长度
for(int i = 0; i < arr.length; i++) {
for(int j = i+1; j < arr.length; j++) {
// 如果子串属于回文子串且子串长度大于当前最长纪录,则替换maxLen
if((j - i + 1) > maxLen && validPalindromic(arr,i,j)){
maxLen = j - i + 1;
begin = i;
}
}
}
return s.substring(begin,begin + maxLen);
}
// 回文验证
private boolean validPalindromic(char[] arr,int left,int right){
while(left < right){
if(arr[left] != arr[right]){
return false;
}
left++;
right--;
}
return true;
}
}
- 中心扩散:时间复杂度降为O(N²)
// 中心扩散:时间复杂度降为O(N²)
class Solution {
public String longestPalindrome(String s) {
// 依然是转为char数组
char[] arr = s.toCharArray();
int maxLen = 1;
int maxLenOdd = 1;
int maxLenEven = 1;
int begin = 0;
// 分为奇数odd、偶数even两种情况取各自的最长子串
for(int i = 0; i < arr.length; i++){
maxLenOdd = validPalindromicLen(arr,i,i); // 奇数子串,初始左右皆为自己
maxLenEven = validPalindromicLen(arr,i,i+1); // 偶数字串,中心为缝隙,左右相邻
if(((maxLenEven > maxLenOdd) ? maxLenEven : maxLenOdd) > maxLen){
maxLen = (maxLenEven > maxLenOdd) ? maxLenEven : maxLenOdd;
if(maxLenEven >= maxLenOdd){
begin = i - maxLen/2 + 1;
}else{
begin = i - maxLen/2;
}
}
}
return s.substring(begin,begin+maxLen);
}
public int validPalindromicLen(char[] arr,int left,int right){
// 左边不低过0,右边不高过数组
while(left>=0 && right < arr.length){
// 如果回文结束
if(arr[left] != arr[right]){
return right - left - 1;
}
left--;
right++;
}
return right - left - 1;
}
}
-
动态规划(后续统一学习)
-
提交记录
提交时间 | 提交结果 | 运行时间 | 内存消耗 | 语言 | 方法 |
---|---|---|---|---|---|
几秒前 | 通过 | 10 ms | 38.2 MB | Java | 中心 |
2 分钟前 | 解答错误 | N/A | N/A | Java | 中心 |
9 分钟前 | 解答错误 | N/A | N/A | Java | 中心 |
1 小时前 | 通过 | 174 ms | 38.6 MB | Java | 暴力 |
1 小时前 | 通过 | 153 ms | 38.6 MB | Java | 暴力 |
1 小时前 | 解答错误 | N/A | N/A | Java | 暴力 |
1 小时前 | 解答错误 | N/A | N/A | Java | 暴力 |
好久不刷题,生疏了不少。 算法要捡起来了 🙄