题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
牛客传送门:点击打开链接
思路:将字符串abcdefg分成俩部分,a和bcdefg,然后将a和bcdefg各位不停的交换。bcdefg则继续进行相同的操作。最后进行一下排序。
public class Title28 {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList<String>();
if(str == null || str.length() == 0)
return result;
char[] s = str.toCharArray();
rank(result,s,0);
Collections.sort(result);
return result;
}
public void rank(ArrayList<String> result,char[] s,int begin){
// 如果到结尾了,加入到结果集。
if(begin == s.length -1){
result.add(new String(s));
return ;
}
for(int i=begin;i<s.length;i++){
if(i != begin){
// 如果值相等,则不用交换
if(s[i] == s[begin])
continue;
swap(s,i,begin);
rank(result,s,begin+1);
swap(s,i,begin);
}else{
rank(result,s,begin+1);
}
}
}
public void swap(char[] s,int posA,int posB){
if(posA == posB)
return ;
char temp = s[posA];
s[posA] = s[posB];
s[posB] = temp;
}
/**
* 测试
*/
public static void main(String[] args) {
ArrayList<String> result = new Title28().Permutation("aabc");
System.out.println(result);
// [aabc, aacb, abac, abca, acab, acba, baac, baca, bcaa, caab, caba, cbaa]
result = new Title28().Permutation("aba");
System.out.println(result); // [aab, aba, baa]
}
}