思想:先看如何分割串s:以串s的每一个位置为分割点,将s分割成两部分[start,end]以及剩下的一部分[end+1,len-1],依次判别本次分割出的子串[start,end]是否回文(本题的特殊要求),是的话符合要求,继续对剩下的那部分[end+1,len-1]进行递归分割即可。
此时注意一下,进行下一步的前题是当前划分的子串为回文串才行,而判断一个子串是否为回文串,可以先进行预处理:提前利用dp思想找出s中的回文子串,这样在后续回溯时,可以直接以此来进行判断,不用再去重新判断了
class Solution {
List<List<String>> res = new ArrayList<>();
public void generateAll(String s,int start,boolean[][]isHW,List<String>trace){//对串s从start处开始切
if(start==s.length()){//分割完了
res.add(new ArrayList<>(trace));
return;
}
for(int end=start;end<s.length();end++){
if(isHW[start][end]){
trace.add(s.substring(start,end+1));
generateAll(s,end+1,isHW,trace);//对串s的剩下部分进行切割
trace.remove(trace.size()-1);
}
}
}
public List<List<String>> partition(String s) {
int len = s.length();
if(len<=0) return res;
boolean[][]isHW = new boolean[len][len];
for(int subLen=1;subLen<=len;subLen++){
for(int start=0;start<len;start++){
int end = start+subLen-1;
if(end>=len)continue;
isHW[start][end] = (subLen==1)||(subLen==2||isHW[start+1][end-1])&&s.charAt(start)==s.charAt(end);
}
}
generateAll(s,0,isHW,new ArrayList<>());
return res;
}
}