1.题目描述
给你一个字符串 s
,找到 s
中最长的回文子串。
2.示例
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
class Solution { public: string longestPalindrome(string s) { string *result = new string(); for(int i=s.length();i>=1;i--){ int endPos = s.length() - i;//字串起始的结束位置 for(int startPos=0;startPos<=endPos;startPos++){ int subStartPos = startPos;//字串开始的位置 int subEndPos = startPos+i-1;//字串结束的尾位置 bool isPalindrome = true; while(subStartPos<=subEndPos){ if(s.at(subStartPos)==s.at(subEndPos)){//首尾相同 subStartPos++; subEndPos--; }else{//首尾不同 isPalindrome = false; break; } } if(isPalindrome){//找到最大回文,且为第一个 *result = s.substr(startPos,i); goto A; } } } A:return *result; } };
示例 2:
输入:s = "cbbd" 输出:"bb"
示例 3:
输入:s = "a" 输出:"a"
示例 4:
输入:s = "ac" 输出:"a"
3.分析
(1)此题难度不大,但算法值得记录和思考。这道题的正向思路是从第一个元素开始,到最后一个元素。依次使字串长度加一,判断是否是回文如果是回文则记录最大长度和起始位置,最后返回。
(2)但更好的方法则是逆序的将字串长度递减。字串长度从全长开始至1,计算当前长度下,字串可以符合长度要求的起末位置。然后判断当前字串是否为回文,如果是则可以直接退出多重循环,
并返回。因为当前符合回文的字串长度是从大到小遍历的,其他长度字串即使符合回文也不会比当前的字串长度长。如果不符合回文则继续进行,直至字串长度减小到1,则单个元素符合回文。这种
算法的回文还可以保证相同字串长度下返回的是第一个符合回文的字串,可以很好的满足题意。
4.代码