思路:DFS+回溯
class Solution {
List<List<String>>list=new ArrayList<>();
String s;
public List<List<String>> partition(String s) {
//从头到尾递归+回溯。
this.s=s;
//这个是满足的每一个集合
List<String>ll=new ArrayList<>();
dfs(ll,0);
return list;
}
public void dfs(List<String>ll,int index){
if(index==s.length())
{
list.add(new ArrayList<>(ll));
return;
}
//i从index开始是因为单个字符也是回文子串
for(int i=index;i<s.length();i++)
{
//如果是回文
if(isPalindrome(index,i)){
//把当前的回文子串s(index,i)加进去
ll.add(s.substring(index,i+1));
dfs(ll,i+1);
//把加进去的回文子串去处。和上面加进去的回文子串是同一个回文子串。
ll.remove(ll.size()-1);
}
}
}
public boolean isPalindrome(int start,int end){
while(start<end){
if(s.charAt(start)!=s.charAt(end))
return false;
start++;
end--;
}
return true;
}
}
为什么终止条件那里 list.add(new ArrayList<>(ll)); 必须要新建一个ArrayList,而不是直接使用ll呢?(实际尝试的时候发现直接用ll确实会导致不对)
原因:即使add到了list,但是下次再对ll改变,list里add的集合也会改变,因为list里维护的也是内存地址,每次递归拿到的ll也是内存地址,这两者是同一个东西。