/*
5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
class Solution {
public:
string longestPalindrome(string s) {
int headtmp, tailtmp;
string ans;
for(int i=0; i<s.length()-1; i++){
for(int j=s.length()-1; j>i; j--){
headtmp=i;
tailtmp=j;
while(headtmp<tailtmp && s[headtmp]==s[tailtmp]){
headtmp++;
tailtmp--;
}
if((headtmp==tailtmp || headtmp-tailtmp==1) && ans.length()<j-i+1) ans=s.substr(i, j-i+1);
}
}
if(ans.length()==0) return s.substr(0, 1);
else return ans;
}
};
// 1748 ms + 7MB 时间复杂度真是一言难尽...(时间复杂度大)
// 思路:假设一段为回文序列(确定头尾的一段s子序列),然后(从头往后==从后往前)验证。穷举并验证了所有可能
class Solution {
public:
string longestPalindrome(string s) {
int headtmp, tailtmp;
string ans;
for(int i=0; i<s.length(); i++){
headtmp=i-1;
tailtmp=i+1;
while(headtmp>=0) {
if(s[headtmp]==s[i]) headtmp--;
else break;
}
while(tailtmp<s.length()) {
if(s[tailtmp]==s[i]) tailtmp++;
else break;
}
while(headtmp>=0 && tailtmp<s.length() && s[headtmp]==s[tailtmp]){
headtmp--;
tailtmp++;
}
if(tailtmp-headtmp>2 && ans.length()<tailtmp-headtmp-1)
ans=s.substr(headtmp+1, tailtmp-headtmp-1);
}
if(ans.length()==0) return s.substr(0, 1);
else return ans;
}
};
// 20 ms + 7.4 MB 时间复杂度!!! nice
// 思路: 确定中心点的一段s子序列,去判断从这个中心点向外能够扩展到多长的序列。也属于穷举,但是穷举后需要验证的只有s.length()个,而上面那种思路有...(反正不止s.length()个)
leetcode写题笔记 -- 最长回文子串
于 2022-04-24 19:50:34 首次发布