思考如何根据这颗递归树编码:
- 每一个节点表示剩余没有扫描到的字符串,产生分支是截取了剩余字符串的前缀
- 产生前缀字符串的时候,判断前缀字符串是否是回文:
* 如果 前缀字符串是回文,则可以产生分支和节点
* 如果前缀字符串不是回文,则不产生分支和节点,这一步是剪枝操作- 在叶子节点是空字符串的时候结算,此时根节点到叶子节点的路径,就是结果集里的一个结果,
使用深度优先遍历,记录所有结果
递归+回溯·
:对一串字符串进行
package BDyNamicProgramming;
import java.util.ArrayList;
import java.util.List;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/4/26 0026 18:12
*/
public class Problem131 {
public List<List<String>> partition(String s) {
List<List<String>> rs = new ArrayList<>();
List<String> path = new ArrayList<>();
dfs(s,0,rs,path);
return rs;
}
/**
*
* @param s
* @param start 接下来从字符串中取回文子串的起始位置
* @param rs
* @param path
*/
public void dfs(String s,int start,List<List<String>> rs,List<String> path){
if(start==s.length()){
rs.add(new ArrayList<>(path));
}
for(int i=start;i<s.length();i++){
//取个子串
String subString = s.substring(start,i+1);
//当前取的是回文串
if(isPar(subString)){
path.add(subString);
//接着确定接下来的是否为回文字符串
dfs(s,i+1,rs,path);
path.remove(path.size()-1);
}
}
}
public boolean isPar(String s){
int left = 0;
int right =s.length()-1;
while(left<=right){
if(s.charAt(left)==s.charAt(right)){
left++;right--;
}else{
return false;
}
}
return true;
}
public static void main(String[] args) {
}
}