5. Longest Palindromic Substring

5. Longest Palindromic Substring,第1张

题意

返回字符串最长的回文子字符串

题解 1、暴击直接暴力遍历,当然结果不通过,时间Time Limit Exceeded

s.substr (pos, n) ,pos表示要截取的字符串的开始的位置,n 代表要截取的字符串的长度

class Solution {
public:
    bool isPalindrome(string s){
        int i=0, j=s.size()-1;
      while(i max){
                        max = temp.size();
                        res = temp;
                    }
                }
            }
        }
        return res;
    }
};
2、中心扩展方法

以babad为例,只需要从某一个中心开始,向左向右对比

以b为轴,向左右扩展,只扩展到b自身

以b|a之间为轴,向左右扩展,可以扩展出ba

依次寻找中心点,正常情况下对于每一个中心点,依次向二边扩展,然后查看回文长度,和起始位置,最后截取这段字符串即可。但是会有一种情况,就是mid位置附近是相同的字符如 bbb 如下图所示。

这种情况 midEnd 需要向后移动二位,到红色箭头出。

class Solution {
public:
    string longestPalindrome(string s) {
        
        // edge cases
        if(s.length() == 0 || s.length() == 1) return s;
        
        // to hold max len and its starting index
        int maxLenBeginIndex = 0;
        int maxLen = 1;
        
        int mid = 0;
        while(mid < s.length()){
            
            // calculating middle window
            
            int midBegin = mid;
            int midEnd = mid;
            
            // handling even length palindromes; the middlemost chars will trivially match in even length case
            // so expand the middle window as long as possible
            while( midEnd + 1 < s.length() && s[midEnd] == s[midEnd + 1]){ midEnd++ ; }
            
            // for next iteration
            mid = midEnd + 1;
            
            // starting comparison in left and right windows
            
            // in case of odd len palindrome; both start from mid;
            // in case of even; midBegin and midEnd handles it all
            int leftWindow = midBegin;
            int rightWindow = midEnd;
            
            // expand the windows left and right simultaneously
            while(leftWindow - 1 >= 0 && rightWindow + 1 < s.length() && s[leftWindow - 1] == s[rightWindow + 1]){
                    leftWindow--;
                    rightWindow++;
            }
            
            // update maxLen is currLen > maxLen
            int currLen = rightWindow - leftWindow + 1;
            if( currLen  > maxLen ){
                maxLenBeginIndex = leftWindow;
                maxLen = currLen;
            }
        }
        
        return s.substr(maxLenBeginIndex, maxLen);
    }
};

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/914749.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-16
下一篇2022-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存