什么是排列?一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列。特别地,当m=n时,这个排列被称作全排列。
拿字符串举例,就是找出这个字符串的所有元素组成的所有不同的序列,注意,这些序列具有唯一性,所以就要仔细考虑字符串存在相同元素的情况。
abc这样的一个字符串,它的全排列就有:abc、acb、bac、bca、cba、cab
不妨把abc分成两部分——前缀+子字符串,可以得到整个字符串的全排列=前缀+子字符串的全排列,首先将所有元素依次放到第一个元素,将其作为前缀,如axx,bxx,cxx,然后再来找剩下字符串的全排列,这时我们又可以把剩下的字符串分为前缀+字符串的形式,依次类推,直到子字符串只有一个元素,那么这个前缀加上这个子字符串就是原字符串的其中一个全排列。代码如下:
import java.util.ArrayList;
import java.util.TreeSet;
public class Solution {
public ArrayList<String> Permutation(String str) {
if(str.length()==0){
return new ArrayList<String>();
}
ArrayList<String> list = new ArrayList<String>();
TreeSet<String> set = new TreeSet<String>();
char[] charArray = str.toCharArray();
Array(set, charArray, 0, charArray.length-1);
for(String string:set){
list.add(string);
}
return list;
}
public void Array(TreeSet<String> set, char[] charArray, int beginIndex, int endIndex){
if(beginIndex==endIndex){
String result = new String(charArray);
set.add(result);
return;
}else{
for(int i=beginIndex;i<=endIndex;i++){
swap(charArray, beginIndex, i);
Array(set, charArray, beginIndex+1, endIndex);
swap(charArray, beginIndex, i);
}
}
}
public void swap(char[] charArray, int first, int second){
char temp = charArray[first];
charArray[first] = charArray[second];
charArray[second] = temp;
}
}