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; } };
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; } };