全排列 - 38. 字符串的排列

在这里插入图片描述

思路:全排列的算法思想:递归剪枝。
把一个数组分为两段,一段是第一个元素,一段是全部元素。
首先要确定第一个元素,而第一个元素可以实待排列的数组中的任意值。而除了第一个元素之外,的其余元素,做全排列。

讲解以下为什么要这么做
所以其实全排列就是做了两件事第一把所有数组中的元素与第一个交换,剩下的数组做全排列,如果没有元素可以全排列了。那么当前的一种情况,就诞生了,把它加入到结果集中。
在这里插入图片描述

如果有重复字符怎么办?在这里插入图片描述
所以当遇到重复字符时,直接跳过,即可。

class Solution {
        public String[] permutation(String s) {
        if(s == null || s.length() == 0) return null;
        //结果集
        ArrayList<String> res = new ArrayList<>();
        //假如要求顺序排列,那么用TreeSet就可以自动顺序排列了。
//        TreeSet<String> res = new TreeSet<>();
        char[] sArray = s.toCharArray();

        permutation(sArray,0,res);
       
         return  res.toArray(new String[res.size()]);
    }

    private void permutation(char[] sArr , int start, ArrayList res){
        //走到了最后的位置就说明已经全排列了。
        if(start == sArr.length){
            res.add(String.valueOf(sArr));
        }
        //用HashSet检查重复字符。
        HashSet checkChar = new HashSet<>();
        for(int j = start ; j < sArr.length ;j++){
//            如果重复就直接跳过。
            if(!checkChar.contains(sArr[j])) {
                checkChar.add(sArr[j]);
                //交换
                swap(sArr,start,j);
                permutation(sArr,start+1,res);
                //复位,让数组的顺序不变,使下一次交换依旧
                swap(sArr,j,start);
            }
        }
    }
    
    private void swap(char[] arr,int i ,int j){
        if(i < 0 || j > arr.length)return;
        char temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
        
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值