Palindrome Partitioning

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

解答:回溯

想法:对于“aaba”,我每次回溯,前面切一段,对后面一段进行重新分割。比如前面从a->aa->aab->aaba,后面对aba/ba/a分别再进行回溯。对新的再进行循环。如果前面一半不是回文,则后面就不用判断了。比如前面切割到a,后面bab切割成ba,此时ba不是回文,则后面a就不再进行判断也不进行回溯。


我的答案:还需要再优化一下,第二个是别人的答案,思路跟我一样,不过他是15ms,我的是24ms,明显如果我优化成他这样就能时间缩短

1.我的答案

class Solution {
public:
    bool isPali(string ss){
    int len = ss.size();
    if(len == 1)
        return true;
    for(int i = 0; i < ss.size()/2; i++){
        if(ss[i] != ss[len-1-i])
        return false;
    }
    return true;
}

void judge(string s, vector<vector<string>>&str, vector<string>&v, int begin){
    if(s.empty()){
        str.push_back(v);
        return;
    }
    if(isPali(s)){
        v.push_back(s);
        str.push_back(v);
        v.pop_back();
    }
    for(int i = begin+1; i < s.size(); i++)
    {
        string str1 = s.substr(begin,i);
        if(isPali(str1)){
            v.push_back(str1);
            string str2 = s.substr(i,s.size()-i);
            judge(str2, str, v, 0);
            v.pop_back();
        }
    }
    return;
}

vector<vector<string>> partition(string s) {
    
    vector<vector<string>> str;
    vector<string>v;
    if(s.size() <= 1){
        v.push_back(s);
        str.push_back(v);
    }
    else
        judge(s, str, v, 0);
    return str;
}
};

2.别人的答案

class Solution {
public:
    vector<vector<string>> partition(string s) {
        vector<string> record;
        vector<vector<string>> result;
        split(s,0,record,result);
        return result;
    }

    void split(string s, int start,vector<string> &record,vector<vector<string>> &result)
    {
        for(int i=start;i<s.length();i++)
        {
            if(isPalindrome(s,start,i))
            {
                string sub=s.substr(start,i-start+1);
                record.push_back(sub);
                if(i==s.length()-1)
                    result.push_back(record);
                else
                {
                    split(s,i+1,record,result);
                }
                record.pop_back();
            }
        }
    }

    bool isPalindrome(string &s,int start,int end)
    {
        while(start<=end)
        {
            if(s[start]==s[end])
            {
                start++;
                end--;
            }
            else
                return false;
        }
        return true;
    }
};









你可能感兴趣的:(LeetCode,C++,backtracking)