给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
经典的回溯做法:从字符串的起始位置开始进行遍历,如果当前子字符串可以成为回文串,那就往下找下去。之后回溯到当前并不选取这个回文串的时候,然后继续往下进行判断。
class Solution {
List<List<String>> ans = new ArrayList<>();
List<String> res = new ArrayList<>();
//回溯
public List<List<String>> partition(String s) {
process(s,0);
return ans;
}
//用来遍历字符串从index位置开始的所有可能情况
public void process(String s,int index){
if(index>s.length()) return;
if(index==s.length()){
ans.add(new ArrayList<>(res));
return;
}
//判断子串s.substring(index, i)是否是回文串
//如果是就可以深入下去继续查找 但是记得回溯
for(int i = index+1;i<=s.length();i++){
String str = s.substring(index, i);
if(isHUI(str)){
res.add(str);
process(s,i);
res.remove(res.size()-1);
}
}
}
//判断是否是回文串
private boolean isHUI(String str) {
int left = 0,right = str.length()-1;
while(left<right){
if(str.charAt(left)!=str.charAt(right)) return false;
left++;
right--;
}
return true;
}
}