分割回文串
一看到这道题,我的第一反应是递归,因为这道题每下一步都可以分为若干个子问题,如图:
根据这棵递归树,写出如下代码:
class Solution {
List<List<String>> list = new ArrayList<List<String>>();
public List<List<String>> partition(String s) {
if(s.length() == 0){
return list;
}
if(s.length() == 1){
List<String> list3 = new ArrayList<String>();
list3.add(s);
list.add(new ArrayList<String>(list3));
}else{
for(int i=1;i<=s.length();i++){
backTrack(new Stack<String>(),s.substring(0,i),s.substring(i,s.length()));
}
}
return list;
}
//根据递归树,回溯递归求解
public void backTrack(Stack<String> stack,String front,String rest){
if(isHuiWen(front) == false) {
return;
}else { //是回文数
stack.add(front);
if(isHuiWen(rest)) {
stack.add(rest);
list.add(new ArrayList<>(stack));
stack.pop();
}
//rest长度为0,则加入list后直接进行出栈,返回
if(rest.length() == 0) {
list.add(new ArrayList<String>(stack));
stack.pop();
return;
}
String s1,s2;
//进行下一个子问题计算
for(int j=1;j<rest.length();j++) {
s1 = rest.substring(0,j);
s2 = rest.substring(j,rest.length());
backTrack(stack, s1, s2);
}
stack.pop();
}
}
//判断是否为回文串
public boolean isHuiWen(String s){
if(s.length() == 0){
return false;
}
boolean res = true;
int start = 0,end = s.length()-1;
while(start < end) {
if(s.charAt(start) == s.charAt(end)) {
start++;
end--;
}else {
res = false;
break;
}
}
return res;
}
}
这力需要注意的是,我们也可以使用 List 然后直接加入最终结果 list中,但根据题目要求,我们只需要对其末尾进行操作,所以我认为 Stack更加适合本题。