题目描述
leetcode_hot100_5
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
错误示范
思路:从某个字符开始分别左右寻找,遇到左边一样left–,遇到右边一样的right++,从中心扩散开,直到左右都不与该字符相同时比较左右字符是否相同,相同继续扩散(注意这里长度要+2)直至不相同为止,遍历整个字符串。
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();
string s_ = "";
int lenmax = 1;
for(int i = 0; i < len; i++){
string s1 = "";
s1 += s[i];
int left=i-1;
int right=i+1;
int lenk = 1;
while(left>=0 && s[i]==s[left]){
s1 = s[left] + s1;
left--;
lenk++;
}
while(right<len && s[i]==s[right]){
s1 = s1 + s[right];
right++;
lenk++;
}
while(left>=0 && right<len && s[left]==s[right]){
s1 = s[left] + s1 + s[right];
left--;
right++;
lenk+=2;
}
if(lenk>=lenmax){
lenmax=lenk;
s_ = s1;
}
}
return s_;
}
};
错误理由:用例91超时
太坑,老长一段。。。
正解
(借鉴了别的uu的方法,真的很6)
class Solution {
public:
string longestPalindrome(string s) {
string sr="";
for(int i = 0; i < s.length(); i++){
fun(s,i,i);
fun(s,i,i+1);
}
sr=s.substr(start,lenk);
return sr;
}
private:
int lenk = 0;
int start;
void fun(string s, int i, int j){
while(i>=0 && j<s.length() && s[i]==s[j] ){
//必须先验证i、j是否越界再比较s[i]、s[j]是否相等
// s[i]==s[j]&&i>=0&&j<s.length() 的顺序就不行,会显示溢出
if(j-i+1>lenk){
lenk=j-i+1;
start=i;
}
i--;
j++;
}
}
};