
.先定义了答案集合ans,和路径path。开始调用dfs递归函数。
如果i来到了结尾s.length的位置代表结束将path加入到ans当中。如果i<s的最后一个字符就继续向深层次遍历。最后到达最后一个字符的位置开始回溯,判断从start到i是否是回文串,是就分割,不是就继续向前回溯。举例abb
start = 0, i = 2时判断abb不是回文串,回溯到 i= 0时,a是回文串分割。然后i和satrt均+1,
start = 1, i = 1进入dfs,在进入i+1,此时i= 2,判断bb是回文串,分割。得到最终结果加入到ans.
回溯到start = i = 1时,刚才进入的是不分割,现在继续向下执行分割,判断b是回文串就分割,继续加1,b又是回文串,继续分割,加入ans。就结束了。
java
class Solution {
public List<List<String>> partition(String s) {
List<List<String>> ans = new ArrayList<>();
List<String> path = new ArrayList<>();
dfs(0,0,s,path,ans);
return ans;
}
private void dfs(int i,int start,String s,List<String> path,List<List<String>> ans){
if(i == s.length()){
ans.add(new ArrayList<>(path));
return ;
}
//不分割
if(i < s.length() - 1){
dfs(i+1,start,s,path,ans);
}
//分割
if(isPalindrome(s,start,i)){
path.add(s.substring(start,i+1));
dfs(i+1,i+1,s,path,ans);
path.removeLast();
}
}
private boolean isPalindrome(String s,int left,int right){
while(left < right){
if(s.charAt(left++) != s.charAt(right--)){
return false;
}
}
return true;
}
}
还有第二种方法,可参考: