www

导航

回溯-全排列(重复字符)

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编辑  收藏  举报