字符串的排列

  • 輸入一個字符串,按字典序打印出該字符串中字符的全部排列。例如輸入字符串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;
    }
}
相關文章
相關標籤/搜索