算法题:回文


2方法:中心扩展、两端收缩
2场景:判断是否回文/找最长回文子串,统计回文子串数量

中心扩展

中心扩展在什么时候好用?

判断是否回文以及找最长回文子串

要找最长回文子串,要一直试探子串是否回文,用中心扩展判断次数更少。虽然用两端收缩也可以,但会多一些计算!

class Solution {
private:
    string findPalindromeSize(string str, int left, int right){
        int n=str.length();
        while(left>=0 && right<n && right<=n-1 && str[left]==str[right]){
            left--;
            right++;
        }
        return str.substr(left+1,right-left-1);
    }
public:
    string longestPalindrome(string s) {
        string ret = "";
        for(int i=0;i<s.length();i++){
            string str1=findPalindromeSize(s, i, i);
            string str2=findPalindromeSize(s, i, i+1);
            ret = str1.length()>ret.length() ? str1 : ret;
            ret = str2.length()>ret.length() ? str2 : ret;
        }
        return ret;
    }
};

完整题目: 5. 最长回文子串

两端收缩

两端收缩在什么时候好用?统计回文子串数量!

这是因为要记忆数量!而两端收缩可以唯一确定一个子串!如果用中心拓展遍历,不方便计数!

class Solution {
    bool isPaliStr(string str, int left, int right){
        if(right==left) return true;
        while(left <= right){
            if(str[left]!=str[right]) return false;
            else if(str[left]==str[right]){
                left++;
                right--;
            }
        }
        return true;
}
public:
    int countSubstrings(string s) {
        int n=s.length();
        if(n==1) return 1;
        int cnt=0;
        for(int i=0;i<n;i++){
            for(int j=i;j<n;j++)
            if(isPaliStr(s,i,j)) cnt++;
        }
        return cnt;
    }
};

完整题目: 647. 回文子串

posted @ 2024-04-19 16:45  修子xiu1zi3  阅读(11)  评论(0编辑  收藏  举报