【leetcode】 Palindrome Partitioniong (middle) (*^__^*)

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"]
  ]

思路:

回溯,但是不是常规回溯,因为解向量大小不定,需要动态判断。 下面是我写的代码, 只用了19ms 非常快, 自己挺满意的。

感受:之前做过DP求最少切几刀令所有部分都是回文,跟这个有点像。 觉得凡是求最的都是用DP,凡是求所有解的都是用回溯。

class Solution {
public:
    vector<vector<string>> partition(string s) {
        vector<vector<string>> ans;
        if(s.empty())
            return ans;

        vector<vector<bool>> isPalindrome(s.length(), vector<bool>(s.length(), false));
        vector<vector<int>> S(s.length(), vector<int>(2, 0)); //每个深度候选范围 用下标范围来记录
        int k = 0;
        vector<string> X;

        while(k >= 0)
        {
            while(k >= 0 && S[k][1] < s.length()) //当前深度判断完毕 通过当前范围结束下标到达s的最后
            {
                int i = S[k][0]; //当前深度判断位置的起始下标
                int j = S[k][1]; //当前深度判断位置的结束下标
                if(s[i] == s[j] && (j - i < 2 || isPalindrome[i+1][j - 1])) //分次判断是否为回文,每次使用历史信息
                {
                    isPalindrome[i][j] = true;
                    while(X.size() >= k + 1) //X长度不固定,所以用的时候会有上一次求解的值,我们需要把多出的部分弹出 !!特别注意
                    {
                        X.pop_back();
                    }
                    X.push_back(s.substr(i, j - i + 1));
                    S[k][1]++;
                    if(S[k][1] < s.length())
                    {
                        k++;
                        S[k][0] = S[k - 1][1];
                        S[k][1] = S[k - 1][1];
                    }
                    else
                    {
                        ans.push_back(X);
                    }
                }
                else
                {
                    S[k][1]++;
                }
            }
            k--;
        }
        return ans;
    }
};
原文地址:https://www.cnblogs.com/dplearning/p/4205509.html