思考如何根據這顆遞歸樹編碼:
- 每一個節點表示剩餘沒有掃描到的字符串,產生分支是截取了剩餘字符串的前綴
- 產生前綴字符串的時候,判斷前綴字符串是否是迴文:
* 如果 前綴字符串是迴文,則可以產生分支和節點
* 如果前綴字符串不是迴文,則不產生分支和節點,這一步是剪枝操作- 在葉子節點是空字符串的時候結算,此時根節點到葉子節點的路徑,就是結果集裏的一個結果,
使用深度優先遍歷,記錄所有結果
遞歸+回溯·
:對一串字符串進行
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) {
}
}