- 輸入一個字符串,按字典序打印出該字符串中字符的全部排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的全部字符串abc,acb,bac,bca,cab和cba。 結果請按字母順序輸出。
- 輸入一個字符串,長度不超過9(可能有字符重複),字符只包括大小寫字母。
//大致的思路是這樣的:
//咱們以三個字符abc爲例來分析一下求字符串排列的過程。首先咱們固定第
//一個字符a,求後面兩個字符bc的排列。當兩個字符bc的排列求好以後,我
//們把第一個字符a和後面的b交換,獲得bac,接着咱們固定第一個字符b,
//求後面兩個字符ac的排列。如今是把c放到第一位置的時候了。記住前面我
//們已經把原先的第一個字符a和後面的b作了交換,爲了保證此次c仍然是和
//原先處在第一位置的a交換,咱們在拿c和第一個字符交換以前,先要把b和
//a交換回來。在交換b和a以後,再拿c和處在第一位置的a進行交換,獲得cb
//a。咱們再次固定第一個字符c,求後面兩個字符b、a的排列。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
HashSet<String> set = new HashSet<String>();
if(str == null || str.length() == 0)
return new ArrayList<String>();
char [] arr = str.toCharArray();
getPermutation(arr, 0, set);
ArrayList<String> ret = new ArrayList<String>(set);
Collections.sort(ret);
return ret;
}
void getPermutation(char [] arr, int index, HashSet<String> ret){
if(index == arr.length){
ret.add(String.valueOf(arr));
return;
}
for(int i = index; i < arr.length; ++i){
swap(arr, index, i);
getPermutation(arr, index+1, ret);
swap(arr, index, i);
}
}
void swap(char [] arr, int index1, int index2){
char tmp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = tmp;
}
}