Palindrome Partitioning

DP + 回溯

    vector<vector<string>> partition(string s) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
        vector<vector<string>> res;
        if(s.empty())
            return res;
        int n = s.size();
        vector<vector<bool>> isPalin(n,vector<bool>(n,false));
        int i,j;
        for(i=0;i<n;i++)
            isPalin[i][i] = true;
        for(i=0;i<n-1;i++)
            isPalin[i][i+1] = (s[i]==s[i+1]?true:false);
        for(int len=3;len<=n;len++)
        {
           for(int i=0;i<n-len+1;i++)
           {
               j = i+len-1;
               isPalin[i][j] = (s[i]==s[j]?isPalin[i+1][j-1]:false);
           }
        }
        vector<string> path;
        dfs(0,s,isPalin,path,res);
        return res;
        
        
    }
    
    void dfs(int pos,string& s,vector<vector<bool>>& isPalin,vector<string>& path,vector<vector<string>>& res)
    {
        if(pos==s.size())
        {
            res.push_back(path);
            return;
        }
        
        for(int i=pos;i<s.size();i++)
        {
            if(isPalin[pos][i])
            {
                path.push_back(s.substr(pos,i-pos+1));
                dfs(i+1,s,isPalin,path,res);
                path.pop_back();
            }
        }
    }

  

posted @ 2013-10-08 20:49  summer_zhou  阅读(96)  评论(0编辑  收藏  举报