题目:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
package main;
import java.util.ArrayList;
import java.util.List;
/**
* @author: chenjb
* @create: 2021-03-07 10:04
*/
public class TestBackTrack {
static List<List<String>> resStr = new ArrayList<List<String>>();
public static void main(String[] args) {
String targetStr = "aab";
List<String> curList = new ArrayList<String>();
backtrack(targetStr.toCharArray(),0,curList);
System.out.println(resStr);
}
/**
* 回溯算法
* @param targetStr
* @param n
*/
public static void backtrack(char[] targetStr,int n,List<String> curList){
if(n == targetStr.length){
resStr.add(new ArrayList<String>(curList));
return;
}
StringBuilder curStr = new StringBuilder("");
for (int i = n; i < targetStr.length; i++) {
curStr.append(targetStr[i]);
if(validHuiwen(curStr.toString())){
curList.add(curStr.toString());
backtrack(targetStr,i+1,curList);
//回溯
curList.remove(curList.size()-1);
}else {
break;
}
}
}
/**
* 校验是否回文
* @param str
* @return
*/
public static Boolean validHuiwen(String str){
char[] targetStr = null;
if(str != null){
targetStr = str.toCharArray();
}
if(targetStr == null || targetStr.length == 0){
return false;
}
Boolean isHuiwen = true;
int length = targetStr.length;
for (int i = 0; i < targetStr.length/2; i++) {
if(targetStr[i] != targetStr[length-1-i]){
isHuiwen = false;
break;
}
}
return isHuiwen;
}
}