131. 分割回文串
回溯:
java
class Solution {
public List<List<String>> partition(String s) {
List<List<String>> ans = new ArrayList<>();
List<String> path = new ArrayList<>();
backtrack(s,ans,path,0);
return ans;
}
//回溯:
//终止条件
//非终止条件:
//子问题 当前操作(要做什么) 下一个子问题是什么 恢复现场
private void backtrack(String s,List<List<String>> ans,List<String> path,int l){
if(l==s.length()){
//一定要复制,因为path是一块可以反复擦用的黑板,不然最后就是空的
ans.add(new ArrayList<>(path));
return;
}
for(int r=l;r<s.length();r++){
if(palindrome(s,l,r)){
path.add(s.substring(l,r+1));
backtrack(s,ans,path,r+1);
path.remove(path.size() - 1);
}
}
}
private boolean palindrome(String s,int l,int r){
while(l<r){
if(s.charAt(l)!=s.charAt(r)){
return false;
}
l++;
r--;
}
return true;
}
}
时间复杂度:O(N*2^N) N是字符串长度
空间复杂度:O(N)