题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
import java.util.ArrayList; import java.util.Arrays; /** * Created by Fay on 2018/2/26. */ public class leetcode28 { ArrayList<String> list = new ArrayList<String>(); public ArrayList<String> Permutation(String str) { if(str == null){ return null; } char[] arr = str.toCharArray(); recursionArrange(arr,0,arr.length-1); return list; } public void recursionArrange(char[] arr ,int start, int end){ if(start == end){ String str = String.valueOf(arr); list.add(str); }else{ for(int i=start; i<=end; i++){ //如果碰到相同的字母,则不做交换,跳过本次循环(首字母除外,会有一次交换) if(i!=start && arr[start]==arr[i]){ continue; }else{ swap(arr, i, start); recursionArrange(arr, start+1, end); swap(arr, i ,start); } } } } public void swap(char[] arr,int m,int n){ char temp = arr[m]; arr[m] = arr[n]; arr[n] = temp; } public static void main(String args[]){ leetcode28 test = new leetcode28(); ArrayList<String> list = test.Permutation("aba"); for(String str:list){ System.out.println(str); } } }
这里有一个地方很奇怪,如果是做递归交换的话,每次交换完之后会恢复原样,那么对于abc来说,最后两个应该是cab和cba的顺序,为何牛客网测试给出了相反的顺序?是否有人可以回答一下~