【回溯 dfs 剪枝】 offer38 字符串的排列

16 篇文章 0 订阅
14 篇文章 0 订阅

题目

输入一个字符串,打印出该字符串中字符的所有排列。可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

思路

47题同思路

代码

public String[] permutation(String s) {
        int length = s.length();
        if(length==0) return new String[0];
        List<String>res = new ArrayList<>();
        char[]ch = s.toCharArray();
        // 排序是为了去重
        Arrays.sort(ch);
        StringBuilder path = new StringBuilder();
        boolean[]used = new boolean[length];
        dfs(ch,0,used,length,res,path);
        //要换成字符串数组
        return res.toArray(new String[0]);
    }
    //类似于全排列,记录过程的变量相当于有两个, 一个是depth(遍历完)一个是used(去重)
    public void dfs(char []ch, int depth, boolean []used, int length, List<String> res, StringBuilder path){
        if(depth==length){
            res.add(path.toString());
            return;
        }
        for(int i = 0;i<length;i++){
            if(!used[i]){
                //给出的字符串会存在重复元素
                // i>=1:防止ch[i-1]下标越界
                //ch[i]==ch[i-1]:与前一个元素 的值相同
                //used[i-1]==false:前一个元素和这个元素相同并且刚被撤销,不可以用,因为还是重复的。如果前一个没被用过可以进行排列
                if(i>=1&&ch[i]==ch[i-1]&&!used[i-1]){
                    continue;
                }
                path.append(ch[i]);
                used[i]=true;
                dfs(ch,depth+1,used,length,res,path);
                used[i]=false;
                //注意删除方法
                path.deleteCharAt(path.length()-1);

            }

        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值