Question:
Given a strings, partitionssuch that every substring of the partition is a palindrome.
Return all possible palindrome partitioning ofs.
For example, givens="aab"
,
Return
[ ["aa","b"], ["a","a","b"] ]
Anwser 1 :
class Solution { public: vector<vector<string>> partition(string s) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<string>> ret; if(s.length() == 0) return ret; vector<int> vec; vec.push_back(-1); part(s, 0, ret, vec); return ret; } void part(string s, int i, vector<vector<string>> &ret, vector<int> &vec) { if(i == s.length()){ vector<string> v; int len = vec.size(); for(int k = 0; k < len-1; k++) v.push_back(s.substr(vec[k]+1, vec[k+1] - vec[k])); ret.push_back(v); return; } for(int j = i; j < s.length(); j++) { if(isPalindrome(s, i, j)) { vec.push_back(j); part(s, j+1, ret, vec); vec.pop_back(); } } } bool isPalindrome(string &s, int i, int j) { while(i < j) { if(s[i++] != s[j--]) return false; } return true; } };
Anwser 2 :
class Solution { public: vector<vector<string>> partition(string s) { // Start typing your C/C++ solution below // DO NOT write int main() function int len=s.length(); int BIG=2*len; int num_line=len+1; vector<int> vec(num_line*num_line); for(int l=1; l<=len; l++)//两个木板之间有多少个字符 { for (int i=0; i+l<num_line; i++)//从第0个木板开始,i+l为木板的序号 { if (l==1) { vec[i*num_line+(i+l)]=1; } else if(l==2) { if (s[i]==s[i+l-1]) vec[i*num_line+(i+l)]=1; else vec[i*num_line+(i+l)]=BIG; } else { if (s[i]==s[i+l-1]) vec[i*num_line+(i+l)] = vec[(i+1)*num_line+(i+l-1)]; else vec[i*num_line+(i+l)]=BIG; } } } vector<vector<int>> index; vector<int> start; start.push_back(0); index.push_back(start); for (int i=0;i<num_line;i++) { int max_len=index.size(); vector<vector<int>>::iterator iter=index.begin(); for(int j=0;j<max_len;j++) { vector<int> current_line=index[j]; if (current_line.back()>=num_line-1) continue; bool first_time=true; for(int a=current_line.back()+1;a<num_line;a++) { if(vec[current_line.back()*num_line+a]==1) { if (first_time) { index[j].push_back(a); first_time=false; } else { vector<int> tmp=current_line; tmp.push_back(a); index.insert(index.begin()+j,tmp); j++; max_len++; } } } } } vector<vector<string>> res; for(int i=0;i<index.size();i++) { vector<string> tmp; res.push_back(tmp); for(int j=0;j<index[i].size()-1;j++) { res[i].push_back(s.substr(index[i][j],index[i][j+1]-index[i][j])); } } return res; } };
参考推荐: