【蓝桥杯】【字符排序】

来源:互联网 发布:济南java工资线 编辑:程序博客网 时间:2024/05/17 21:56

题目
算法是这样的,如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种。
如:给定 A、B、C三个不同的字符,则结果为:ABC、ACB、BAC、BCA、CAB、CBA一共3!=3*2=6种情况。

分析
求全排列是很常见的题目类型,在找所有可能性的时候,我们用到了交换的思想:a[0]和后面所有的元素交换位置,是一种不同的排列,应用上递归的思想,后面的子数组也是用相同的交换去找出不同的排列。
但是要注意去除重复的排列。

源码

    private static char[] a;    private static TreeSet<String> resultSet; //帮助排序,帮助去重    public static void main(String[] args) {        String s = "abcd";        a = s.toCharArray();        resultSet = new TreeSet<String>();        f(0);        for (String s1 : resultSet) {            System.out.println(s1);        }        System.out.println(resultSet.size());    }    private static void f(int index){        if(index == a.length-1){            return;        }        for(int i=index; i<a.length; i++){            {                char temp = a[i];                a[i] = a[index];                a[index] = temp;            }            //新的排列产生            resultSet.add(Arrays.toString(a));            f(index+1);            {                //回溯                char temp = a[i];                a[i] = a[index];                a[index] = temp;            }        }    }

结果
[A, B, C]
[A, C, B]
[B, A, C]
[B, C, A]
[C, A, B]
[C, B, A]
6

原创粉丝点击