力扣 131. 分割回文串 dp 回溯

https://leetcode-cn.com/problems/palindrome-partitioning/
在这里插入图片描述
思路:先 d p dp dp进行预处理,如果 s [ i … j ] s[i…j] s[ij]是回文串就令 d p [ i ] [ j ] = 1 dp[i][j]=1 dp[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