動態規劃例題leetcode例題6:依舊是迴文,但是有點不一樣

給定一個字符串,你的任務是計算這個字符串中有多少個迴文子串。

具有不同開始位置或結束位置的子串,即使是由相同的字符組成,也會被計爲是不同的子串。

示例 1:

輸入: “abc”
輸出: 3
解釋: 三個迴文子串: “a”, “b”, “c”.
示例 2:

輸入: “aaa”
輸出: 6
說明: 6個迴文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”.
注意:

輸入的字符串長度不會超過1000。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/palindromic-substrings
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

有些獨特的動態規劃解法:
畢竟這個題沒有要求最值,所以直接用dp數組記錄是或者否就行了

class Solution {
public:
    int ans=0;
    int countSubstrings(string s) {
        int N=s.size();
        //dp只是表示i到j的字符串是不是迴文串
        vector< vector<bool> > dp(N,vector< bool >(N,false));
        for(int i=N-1;i>=0;i--)
        {
            for(int j=i;j<N;j++)
            {
                //兩種情形:在有相同的字符的情況下,如果字符串長度不超過3
                //那麼是迴文串,或者中間夾的那個字符串是迴文串,總字符串就
                //迴文串
                if(s[i]==s[j]&&(j-i<3||dp[i+1][j-1]))
                {
                    dp[i][j]=true;
                    ans++;
                }
            }
        }
        return ans;
        

    }
};

雙指針法:
對每一個字符串的字符遍歷,在兩端的字符相同的情況下利用兩個指針向兩邊擴展

class Solution {
public:
    int n=0;
    void Count(string s,int i,int j)//i左移,j右移
    {
        while(i>=0&&j<s.size()&&s[i]==s[j])
        {
            n++;
            i--;
            j++;
        }
    }
    int countSubstrings(string s) {
        for(int i=0;i<s.size();i++)
        {
            Count(s,i,i);//計算迴文是奇數的迴文字符串
            Count(s,i,i+1);//計算迴文是偶數的迴文字符串
        }
        return n;

    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章