首先我们拿到题目,应该考虑到是在考察字符串的全部排列。
思路:第一步:我们可以先将字符串分为两部分,第一个字符和后面的字符
第二步:我们求出所有可能出现在第一个位置的字符,然后再和后面的字符交换,相同的不用换
第三步:固定第一个字符,然后求后面字符的排列,至于后面字符的排列,我们可以看作再次固定第一个字符,以此类推,用递归可以简单快速的解决这个问题
我们以abc来举例:
测试代码:
public static void main(String[] args) { System.out.println("请输入字符串:"); String str = ""; Scanner scan = new Scanner(System.in); str = scan.nextLine(); printall(str); System.out.println(printall(str)); } private static ArrayList<String> printall(String str) { ArrayList<String> result = new ArrayList<>(); if (str == null || str.length() == 0){ return result; } char[] chars = str.toCharArray(); //按字典顺序输出 TreeSet<String> temp = new TreeSet<>(); printallstr(chars,temp,0); result.addAll(temp); return result; } private static void printallstr(char[] chars, TreeSet<String> temp, int index) { if (chars == null || chars.length == 0 || index < 0 || index > chars.length){ return; } if (index == chars.length-1){ //递归的结束 temp.add(String.valueOf(chars)); }else { for (int i = index;i < chars.length;i++){ //把第一个字符和后面的字符交换 swap(chars,i,index); //对后面的所有字符进行全排列 printallstr(chars,temp,index+1); //把第一个字符再换回来,方便再与其他字符交换 swap(chars,i,index); } } } private static void swap(char[] chars, int i, int index) { char temp = chars[i]; chars[i] = chars[index]; chars[index] = temp; }
运行结果:
请输入字符串:
abc
[abc, acb, bac, bca, cab, cba]