输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
public class Test27 {
public ArrayList<String> Permutation(String str) {
ArrayList<String> list=new ArrayList<>();
if(str.length()==0){
return list;
}
char[] chars=str.toCharArray();
Arrays.sort(chars);
list.add(String.valueOf(chars));
int last=chars.length-1;
while(true){
int i=last;
int m;
while(i>0&&chars[i-1]>=chars[i]){
i--;
}
if(i==0){
break;
}
m=last;
while(m>i&&chars[m]<=chars[i-1]){
m--;
}
swap(chars,i-1,m);
reverse(chars,i);
list.add(String.valueOf(chars));
}
return list;
}
private void reverse(char[] chars, int cur) {
if (chars == null || chars.length <= cur) {
return;
}
int l = chars.length - 1;
for (int i = 0; i <= (l - cur) / 2; i++) {
int m = cur + i;
int n = l - i;
if (m < n) {
swap(chars, m, n);
}
}
}
private void swap(char[] chars, int m, int n) {
char temp;
temp = chars[m];
chars[m] = chars[n];
chars[n] = temp;
}
}