前言
这几天不是在写文章总结黑马点评吗,感觉敲代码的能力确实有点欠缺了,主要是敲项目代码的时候,接入了AI,大部分代码都是直接按Tab键自动生成的,代码能力确实有一点退步了🤪🤪🤪,这几天学学数据结构,刷刷题🏄🏄🏄,冲冲冲一天一道,(但是我感觉可能坚持不下去🤪)
题目
给你一个字符串 s,找到 s 中最长的 回文 子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母组成
核心思路:一句话解释
回文串一定有一个 "中心"。
- 奇数长度(如 "aba"):中心是一个字符。
- 偶数长度(如 "abba"):中心是两个字符的缝隙。
我们要遍历每个字符,把它当成中心,向两边无限扩散,直到左右字符不相等为止,记录最长的那个。
java
class Solution {
public String longstPalindrome(String s){
//边界处理: 空串或单字符串直接返回
if (s == null || s.length() < 2) {
return s;
}
int start = 0; //记录最长回文的起始下标
int end = 0; //记录最长回文的结束下标
//遍历每个字符, 作为回文中心
for (int i = 0; i < s.length(), i++) {
//情况1 : 以 i为中心 (奇数长度回文)
int len1 = expandAroundCenter(s, i, i);
//情况2: 以 i 和 i+1 之间为中心 (偶数长度回文)
int len2 = expandAroundCenter(s, i, i+1);
//取当前能扩出的最大长度
int maxLen = Math.max(len1, len2);
//如果当前长度比之前记录的长, 更新start和end
if (maxLen > end - start) {
start = i - (maxLen - 1) / 2;
end = i + maxLen / 2;
}
}
// substring 是左闭右开, 所以 end + 1
return s.substring(start, end + 1);
}
/**
* 辅助方法:从 left 和 right 位置向两边扩散,返回回文长度
* @param s 字符串
* @param left 左指针
* @param right 右指针
* @return 回文串长度
*/
private int expandAroundCenter(String s, int left, int right) {
//只要左右不越界, 且字符相等, 就继续扩散
while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){
left--;
right++;
}
// 退出循环时,左右已经不相等了,真实长度是 (right-1) - (left+1) + 1 = right - left - 1
return right - left - 1;
}
}
小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)
...。。。。。。。。。。。...

...。。。。。。。。。。。...