字符串的排列(剑指offer-27)

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

题目解析

字符串的排列(剑指offer-27)_第1张图片
首先确定一个初始位置,然后通过递归去查找每一个位置的字符可能出现情况。比如说现在要找index下标位置的字符,那么体现在代码中就是交换index以及index位置之后的那些字符。

题目解答

import java.util.*;
public class StringSort {
    public ArrayList Permutation(String str) {
        char[] a = str.toCharArray();
        ArrayList ans = new ArrayList<>();
        solve(ans,a,0,str.length());
        ans = new ArrayList(new HashSet(ans));//去重
        Collections.sort(ans);//字典排序 -> ans.sort(null);
        return ans;
    }

    private void solve(ArrayList ans, char[] a, int index, int length) {//进行全排列
        if (index == length-1){//当前位置在字符串的最后
            String res = change(a);//将char转换成String类型的函数
            ans.add(res);
        }
        else{//现在要确定index位置的字符,将index与index以后的字符进行交换
            for (int i = index; i < length; i++) {
                char tmp = a[i];
                a[i] = a[index];
                a[index] = tmp;
                //当前index位置的字符已经通过交换找到,递归寻找下一个位置的字符
                solve(ans,a,index+1,length);
                //为了消除当前层去递归的时候的进行交换字符的影响,
                //如果不消除的话,那么就会造成原index位置的字符发生变化
                tmp = a[i];
                a[i] = a[index];
                a[index] = tmp;
            }
        }
    }

    private String change(char[] a) {//将char转换成String类型的函数
        StringBuilder res = new StringBuilder();
        for (char value:a
             ) {
                res.append(value
                );
        }
        return res.toString();

    }
}

你可能感兴趣的:(字符串的排列(剑指offer-27))