Question:
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"] ]
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() functionint 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;elsevec[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)];elsevec[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; }};
參考推薦:
leetcode:Palindrome Partitioning
Palindrome Partitioning