给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]
这道题目直接用DFS回溯的方法解决。
class Solution {
public boolean isPalindrome(String s, int start, int end){
while(start<end){
if(s.charAt(start) != s.charAt(end)) return false;
start++;
end--;
}
return true;
}
public void helper(List<List<String>> res, List<String> list,
String s,int start){
if(start==s.length()){
res.add(new ArrayList<>(list));
return;
}
for(int i=start;i<s.length();i++){
if(isPalindrome(s, start, i)){
list.add(s.substring(start, i+1)); // 注意左闭右开
helper(res,list,s,i+1);
list.remove(list.size()-1);
}
}
}
public List<List<String>> partition(String s) {
List<List<String>> res = new ArrayList<>();
helper(res,new ArrayList<>(),s,0);
return res;
}
}
C++ 代码
class Solution {
public:
bool isPalindrome(string &s, int left, int right){
while(left<right){
if(s[left]!=s[right]) return false;
left++;
right--;
}
return true;
}
void helper(vector<vector<string>> &res, vector<string> list, string &s, int start){
if(start==s.size()){
res.push_back(list);
return;
}
for(int i=start;i<s.size();i++){
if(isPalindrome(s,start,i)){
list.push_back(s.substr(start,i-start+1));
helper(res,list,s,i+1);
list.pop_back(); // 回溯
}
}
}
vector<vector<string>> partition(string s) {
vector<vector<string>> res;
helper(res,vector<string>(),s,0);
return res;
}
};