输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> list = new ArrayList<>();
if (str == null || "".equals(str)) return list;
char[] chars = str.toCharArray();
Arrays.sort(chars);
list.add(charToString(chars));
while (getNextPermutation(chars)) {
list.add(charToString(chars));
}
return list;
}
public String charToString(char[] chars) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < chars.length; i++) {
sb.append(chars[i]);
}
return sb.toString();
}
public boolean getNextPermutation(char[] chars) {
if (chars.length == 1) {
return false;
}
int i = chars.length - 1;
for (;;) {
int ii = i;
i--;
if (chars[i] < chars[ii]) {
int j = chars.length ;
while (chars[i] >= chars[--j]) ;
char tmp = chars[i];
chars[i] = chars[j];
chars[j] = tmp;
reverse(chars, ii, chars.length - 1);
return true;
}
if (i == 0) {
reverse(chars, 0, chars.length - 1);
return false;
}
}
}
public void reverse(char[] chars, int s, int e) {
for (int i = s, j = e; i < j ; i++, j--) {
char tmp = chars[i];
chars[i] = chars[j];
chars[j] = tmp;
}
}
}