题目链接:
5. 最长回文子串 - 力扣(LeetCode)
思路分析:
s长度最大是1000,考虑枚举,枚举每一个s[i],以s[i]为中心点向两侧枚举,可以发现:
当枚举的区间长度为奇数时:只需要满足中心点两侧的字符相等即为回文串,此时两个指针直接赋值`i-1` 和 `i+1`即可
当枚举的区间长度为偶数时,同理,只需要将枚举的起始位置中的两个指针有一个从当前s[i]开始即可(具体细节看代码)
代码1:c++
class Solution {
public:
string longestPalindrome(string s) {
string res = "";
for(int i = 0;i < s.size();i++) {
//长度为奇数 以i为中心点 l r直接赋值中心点的两侧开始移动
int l = i - 1, r = i + 1;
//以s[i]为中点 l r向两侧移动 直到s[l]和s[r]不相等
while(l >= 0 && r < s.size() && s[l] == s[r])
l--,r++;
//发现区间长度大于当前res的长度则更新
if(res.size() < r - l - 1)
//这里的substr用法 第一个参数为s的截取起始位置 第二个参数是截取的长度
res = s.substr(l + 1,r - l - 1);
//长度为偶数 此时左侧移动点从i开始 右侧从i+1开始
l = i, r = i + 1;
while(l >= 0 && r < s.size() && s[l] == s[r])
l--,r++;
if(res.size() < r - l - 1)
res = s.substr(l + 1,r - l - 1);
}
return res;
}
};
代码2:java文章来源:https://www.toymoban.com/news/detail-825843.html
class Solution {
public String longestPalindrome(String s) {
String res = "";
for(int i = 0;i < s.length();i++) {
int l = i - 1, r = i + 1;
while(l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)){
l--;
r++;
}
if(res.length() < r - l - 1)
res = s.substring(l + 1, r);
l = i;
r = i + 1;
while(l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
l--;
r++;
}
if(res.length() < r - l - 1)
res = s.substring(l + 1, r);
}
return res;
}
}
文章来源地址https://www.toymoban.com/news/detail-825843.html
到了这里,关于leetcode5_最长回文字串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!