首页 > 其他 > 详细

131. Palindrome Partitioning (Recursion, DP)

时间:2015-10-05 06:59:33      阅读:330      评论:0      收藏:0      [点我收藏+]

Given a string s, partition s such that every substring of the partition is a palindrome.

Return all possible palindrome partitioning of s.

For example, given s = "aab",
Return

  [
    ["aa","b"],
    ["a","a","b"]
  ]

思路: 首先使用动态规划纪录从i到j是否是回文数;然后遍历字符串,对于flag[depth][i]有选择与不选择两种情况,所以使用带回溯的递归,回溯法注意在递归返回后要将递归前改动的内容复原。

class Solution {
public:
    vector<vector<string>> partition(string s) {
        results.clear();
        int sLength = s.length();
        
        vector<vector<bool>> flag(sLength, vector<bool>(sLength,false)); //flag[i][j]纪录i到j是否是回文数
    
        for (int i=0;i<sLength;i++)
        {
            for(int j=0;j<=i;j++)
                if(s[i]==s[j]&&(i-j<2||flag[j+1][i-1])) //动态规划状态转移方程
                {
                    flag[j][i]=true;
                }
        }

        vector<string> pre;
        dfs(s,flag,pre,0);
        return results;
    }
    void dfs(const string &s, vector<vector<bool>> &flag, vector<string> &pre, int depth)
    {
        if(depth>=s.length()) //结束条件:最后一个字符已遍历
        {
            results.push_back(pre);
            return;
        }
        
        for(int i = depth; i<s.length(); i++)
        {
            if(flag[depth][i])
            {
                pre.push_back(s.substr(depth, i-depth+1)); //遍历前将当前找到的回文数加入
                dfs(s,flag,pre,i+1);
                pre.pop_back(); //回溯
            }
        }
    }
private:
    vector<vector<string>> results;
};

 

131. Palindrome Partitioning (Recursion, DP)

原文:http://www.cnblogs.com/qionglouyuyu/p/4855296.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!