演算法題:迴文

AbstractJava發表於2024-04-19

目錄
  • 兩端收縮
  • 中心擴充套件

2方法:兩端收縮、中心擴充套件
2場景:統計迴文子串數量,最長迴文子串

兩端收縮

兩端收縮在什麼時候好用?統計迴文子串數量!

這是因為要記憶數量!而兩端收縮可以唯一確定一個子串!如果用中心擴充遍歷,不方便計數!

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. 迴文子串

中心擴充套件

中心擴充套件在什麼時候好用?
試探最長子串!只記憶長度,不記憶數量!

用兩端收縮也可以!但會多一些計算!

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;
    }
};

相關文章