字符的全排列

问题描述:
输入一串不重复的字符串,输出所有字符的全排列。例如输入“abc” 输出”abc” “acb” “bac” “bca” “cab” “cba” 。

思路:
对于输入的字符串,固定其首位,每次让第一位和后面的某一位交换,变成新的字符串,然后对去掉首位的字符串求全排列。

如abc ,先固定a,然后求bc的全排列 , 得到abc 和abc
然后交换a和b,得到bac,然后固定b,求ac的全排列,得到bac和bca。
换回a和b。
最后交换a和c,得到cba,固定c,求ba全排列,得到cba 和cab。

每次求完换位后的全排列 在下次交换之前,要换回原来的顺序。

递归代码:

public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    String string = input.nextLine();
    //从0位开始求全排列
    solution(string.toCharArray(),0);
}
public static void solution(char[] str,int index){

    if(index >= str.length){
            return;
        }
        //到了最后一位,可以输出
        if(index == str.length - 1){
            System.out.println(String.valueOf(str));
        }
        else{

            for(int i=index;i<str.length;i++){
                //交换首位和其他位的字符
                char temp = str[index];
                str[index] = str[i];
                str[i] = temp;
                //求字串的全排列
                solution(str,index+1);
                //换回原顺序
                temp = str[i];
                str[i] = str[index];
                str[index] = temp;
            }
        }
}

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

思路:
1、用TreeSet可以直接实现去重和排序,(虽然有取巧的嫌疑),核心代码不变。
2、也可以用set去重,然后结果排序。
合理利用数据结构,高效!

发布了52 篇原创文章 · 获赞 16 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Tuzi294/article/details/53166768
今日推荐