题目描述
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ]
问题分析
此题为DFS问题。DFS函数中可变参数有两个:level和out。level表示接下来找回文串是从字符串s的level位置开始找,数组out保存已经找到的回文串。分别截取从level开始的前1个,前2个......一直到字符串s末尾的字符串,判断其是否为回文串,如果是那么将这部分子串加入到out中,然后从子串的下一个位置开始DFS。当DFS函数返回后,将out数组pop_back()。递归基是当level等于s.size()时,说明此时数组out中已经是分割好了的字符串了,将out加入ans中并返回。最终当搜索结束后,返回ans。
代码实现
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> ans;
vector<string> out;
DFS(0, out, ans, s);
return ans;
}
void DFS(int level, vector<string>& out, vector<vector<string>>& ans, string& s){
if(level == s.size()){
ans.push_back(out);
return;
}
for(int i = level; i < s.size(); i++){
if(ishuiwen(level, i, s)){
out.push_back(s.substr(level, i - level + 1));
DFS(i + 1, out, ans, s);
out.pop_back();
}
}
}
bool ishuiwen(int start, int end, string s){
int i = start;
int j = end;
while(i < j){
if(s[i] == s[j]){
i++;
j--;
continue;
}
else
return false;
}
return true;
}
};