• 剑指 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();
        }
    }
    
    
    因为我喜欢追寻过程中的自己
  • 相关阅读:
    [GoogleInterview]连续子序列问题
    [Codeforces #615 div3]1294E Obtain a Permutation
    重识线段树——Let's start with the start.
    [易语言][ExDui][Tutorial]1.NameSelector
    [LuoguP1025][数据加强]数的划分
    [易语言][ExDui][Tutorial]0.Hello,world!
    Hello,cnblog!
    棋牌覆盖问题(分治)
    UVA 11732题解
    LA 3942Remember the Word
  • 原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359739.html
Copyright © 2020-2023  润新知