回溯-全排列(重复字符)
package backtrack; import java.util.*; // 关键点:剪枝,树的每层表示字符串的某一位置,不能重复 public class Permute { private static List<String> res = new ArrayList<>(); private static List<String> permute(String s) { if (s == null || s.length() < 1) { return res; } char[] c = s.toCharArray(); backTrack(c, 0); return res; } private static void backTrack(char[] c, int index) { // 触发结束条件 if (c.length - 1 == index) { res.add(String.valueOf(c)); } Set<Character> visited = new HashSet<>(); // 选择列表 for (int i = index; i < c.length; i++) { if (visited.contains(c[i])) { continue; } // 做选择 swap(c, index, i); visited.add(c[index]); backTrack(c, index + 1); // 撤销选择 swap(c, index, i); } } private static void swap(char[] c, int i, int j) { char temp = c[i]; c[i] = c[j]; c[j] = temp; } public static void main(String[] args) { permute("aaaaaaaaab"); } }
posted on 2020-09-16 17:56 www_practice 阅读(174) 评论(0) 编辑 收藏 举报