全排列 - 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;
        
    }
原创文章 139 获赞 23 访问量 5924

猜你喜欢

转载自blog.csdn.net/weixin_44916741/article/details/104410476