题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
示例1
输入
"ab"
返回值
["ab","ba"]
题目分析
这是全排列的一个变形,不同点在于元素可以重复,且输出为字典序,对于重复元素的处理是当交换的两个元素相同时,不进行交换,字典序可以调用Collections的sort方法。
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
//返回数组
ArrayList<String> res = new ArrayList<>();
public ArrayList<String> Permutation(String str) {
pailie(str.toCharArray(), 0, str.length()-1);
Collections.sort(res);
return res ;
}
//全排列,begin和end是全排列的区间
public void pailie(char[] ch, int begin, int end) {
//如果全排列的区间为一个,将数组加入res
if(begin == end) {
StringBuffer buffer = new StringBuffer();
for(int i = 0; i < ch.length; i++) {
buffer.append(ch[i]);
}
res.add(buffer.toString());
} else {
//每回交换区间的第一个元素和其它元素,然后在对剩下的元素排列,注意这里需要加入条件i != begin
for(int i = begin; i <= end; i++) {
if(ch[begin] == ch[i] && i != begin ) {
continue;
}
swap(ch, i, begin);
pailie(ch, begin + 1, end);
swap(ch, i, begin);
}
}
}
public void swap(char[] s,int i,int j) {
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}