思路:
DFS。
相当于需要把一个串分割成若干子串,每一个子串都必须是回文。
那么从start开始分,如果[s[start],s[i]]是回文,再从start+i开始分,递归下去。
class Solution {
private:
bool isPalindrome(const string s, int start, int end) {
while(start < end && s[start] == s[end]) {
start++;
end--;
}
return start >= end;
}
void dfs(string s, vector<vector<string>>& res, vector<string> &path, int start) {
if(start == s.size()) {
res.push_back(path);
return;
}
for(int i = start; i < s.size(); ++i) {
if(isPalindrome(s, start, i)) {
path.push_back(s.substr(start, i-start+1));
dfs(s, res, path, i+1);
path.pop_back();
}
}
}
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> res;
vector<string> path;
dfs(s, res, path, 0);
return res;
}
};