Likou131。分割回文dpバックトラッキング

https://leetcode-cn.com/problems/palindrome-partitioning/
ここに画像の説明を挿入します
アイデア:dp dp firstD pは、前処理された場合、S [I ... J]の[I ... J]s [ ij ]は回文素数であるため、dp [i] [j] = 1 dp [i] [j] = 1d p [ i ] [ j ]=1.詳細については、このブログを参照してくださいそして、明らかにそれは単なる検索です...バックトラッキング方法について話すことはあまり感じません...

class Solution {
    
    
public:

    void dfs(vector<vector<string>> &ans,vector<int>& vec,const string &s,const vector<vector<bool>> &dp,int n)
    {
    
    
        int start=vec.back();
        if(start==n)
        {
    
    
            vector<string> tmp;
            int m=vec.size();
            for(int i=1;i<m;i++)
                tmp.push_back(move(s.substr(vec[i-1],vec[i]-vec[i-1])));
            ans.push_back(move(tmp));
            return;
        }
        for(int i=start;i<n;i++)
        {
    
    
            if(dp[start][i])
            {
    
    
                vec.push_back(i+1);
                dfs(ans,vec,s,dp,n);
                vec.pop_back();
            }
        }
    }

    vector<vector<string>> partition(string s) {
    
    
        int n=s.size();
        vector<vector<bool>> dp(n,vector<bool>(n));
        dp[0][0]=1;
        for(int i=1;i<n;i++)
        {
    
    
            dp[i][i]=1;
            if(s[i]==s[i-1])
                dp[i-1][i]=1;
        }
        for(int len=3;len<=n;len++)
        {
    
    
            for(int i=0;i+len-1<n;i++)
            {
    
    
                int j=i+len-1;
                if(s[i]==s[j]&&dp[i+1][j-1])
                    dp[i][j]=1;
            }
        }
        vector<vector<string>> ans;
        vector<int> vec(1);
        dfs(ans,vec,s,dp,n);
        return ans;
    }
};

おすすめ

転載: blog.csdn.net/xiji333/article/details/114506156