1 题目
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
Example:
Input: "aab"
Output:
[
["aa","b"],
["a","a","b"]
]
2 尝试解
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> result;
vector<string> temp;
split(result,temp,s);
return result;
}
bool palindrome(string s){
int left = 0;
int right = s.size()-1;
while(left < right){
if(s[left] != s[right]) return false;
left ++;
right --;
}
return true;
}
void split(vector<vector<string>>&result,vector<string>&temp,string s){
if(s.size() == 0) {
result.push_back(temp);
return;
}
for(int i = 1; i <= s.size(); i++){
if(palindrome(s.substr(0,i))){
temp.push_back(s.substr(0,i));
split(result,temp,s.substr(i));
temp.pop_back();
}
}
}
};
3 标准解
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string> > ret;
if(s.empty()) return ret;
vector<string> path;
dfs(0, s, path, ret);
return ret;
}
void dfs(int index, string& s, vector<string>& path, vector<vector<string> >& ret) {
if(index == s.size()) {
ret.push_back(path);
return;
}
for(int i = index; i < s.size(); ++i) {
if(isPalindrome(s, index, i)) {
path.push_back(s.substr(index, i - index + 1));
dfs(i+1, s, path, ret);
path.pop_back();
}
}
}
bool isPalindrome(const string& s, int start, int end) {
while(start <= end) {
if(s[start++] != s[end--])
return false;
}
return true;
}
};