回溯——131.分割回文串

这个题最重要的是理解到,最后返回的结果是“分割”方法,分割出来的结果暂存:

 1 (StringBuilder) sb.append(partition[i]); 

只有是回文串的sb,才能加入path中,如果当前的分割方法切出来的这个子串已经不是回文串,那么在回溯树中的这个分支直接砍掉不进回溯:

 1     private void backtracking(StringBuilder[] partition, int startIndex) {
 2         StringBuilder sb = new StringBuilder("");
 3         for (int i = startIndex; i < partition.length; ++i) {
 4             sb.append(partition[i]);
 5             //只有当sb是回文串的时候,该路径才能继续向下
 6             if (judge(sb)) {
 7                 path.add(sb.toString());
 8                 // System.out.println(path.toString());
 9                 if (i == partition.length-1) {
10                     result.add((ArrayList) path.clone());
11                 } else {
12                     backtracking(partition, i+1);
13                 }
14                 path.remove(path.size()-1);
15             }
16             // 当前的sb不是回文串,该分支直接放弃
17             // else {
18             //     continue;
19             // }
20         }
21     }

回文串的判断:

1     private boolean judge(StringBuilder sb) {
2         int left = 0, right = sb.length()-1;
3         while (left <= right) {
4             if (sb.charAt(left++) != sb.charAt(right--)) {
5                 return false;
6             }
7         }
8         return true;
9     }

 

posted @ 2021-12-08 21:13  Mirror559  阅读(27)  评论(0)    收藏  举报