剑指 Offer 38. 字符串的排列

剑指 Offer 38. 字符串的排列

难度中等109收藏分享切换为英文接收动态反馈

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:

输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]

限制:

1 <= s 的长度 <= 8

深度优先搜索,可以在每一位上维护一个set集合防止该位出现相同的字符导致重复,达到剪枝的目的。

package LeetCode;

import java.util.*;

/**
 * @ClassName Offer38
 * @Description TODO
 * @Author m
 * @Version 1.0
 */
public class Offer38 {

    List<String> res = new ArrayList<>();
    char[] c;

    public String[] permutation(String s) {
        c = s.toCharArray();
        dfs(0);
        return res.toArray(new String[res.size()]);
    }

    /**
     * 搜索确定第x位上的字符
     * @param x
     */
    private void dfs(int x) {

        //遍历到头,将当前的字符数组转化为字符串加入结果
        if (x == c.length-1) {
            res.add(String.valueOf(c));
            return;
        }

        //对每一个位置出现过的字符记录,防止同一位置出现相同的字符,达到剪枝的目的
        Set<Character> set = new HashSet<>();

        for (int i = x; i < c.length; i++) {
       
            if(set.contains(c[i])) {
                continue;
            }

            set.add(c[i]);
            swap(i , x);
            //遍历下一个字符
            dfs(x+1);
            swap(i, x);

        }

    }

    /**
     * 交换字符数组的字符
     * @param i
     * @param j
     */
    private void swap(int i, int j) {
        char tmp = c[i];
        c[i] = c[j];
        c[j] = tmp;

    }


    public static void main(String[] args) {
        for (String s : new Offer38().permutation("abc")) {
            System.out.println(s);
        }
        System.out.println();
    }
}

因为我喜欢追寻过程中的自己
原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359739.html