1. 题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
2. 解题思路
这道题就是常规的排列组合问题,只是输入字符串中带有重复的字符,因此要特别注意这个细节。对于一般的排列组合问题,我都采用先固定某个位置的字符,再针对后面位置进行排序,一直到所有字符都排完,这个步骤是重复的,因此我们可以考虑采用递归来实现。
3.实现代码
3.1 C++代码
class Solution {
public:
vector<string> ans;
vector<string> Permutation(string str) {
if(str.size()==0)return ans;
permutation1(str,0);
sort(ans.begin(),ans.end());
return ans;
}
void permutation1(string str,int begin){
if(begin==str.size()-1){
ans.push_back(str);
return ;
}
else {
permutation1(str,begin+1);
for(int i=begin+1;i<str.size();i++){
if(str[i]!=str[begin]){
char tmp = str[i];
str[i] = str[begin];
str[begin] = tmp;
permutation1(str,begin+1);
tmp = str[i];
str[i] = str[begin];
str[begin] = tmp;
}
}
}
}
};
3.2Java代码
import java.util.Collections;
import java.util.ArrayList;
import java.util.Comparator;
public class Solution {
public ArrayList<String> ans = new ArrayList<String>();
public ArrayList<String> Permutation(String str) {
int len = str.length();
char[] s = str.toCharArray();
if(len==0)return ans;
permutation(s,0);
Collections.sort(ans,new Comparator<String>(){
@Override
public int compare(String str1,String str2){
return str1.compareTo(str2);
}
});
return ans;
}
public void permutation(char[] str,int begin){
if(begin==str.length-1){
String s = new String(str);
ans.add(s);
return;
}else{
permutation(str,begin+1);
for(int i=begin+1;i<str.length;i++){
if(str[i]!=str[begin]){
char tmp = str[begin];
str[begin] = str[i];
str[i] = tmp;
permutation(str,begin+1);
tmp = str[begin];
str[begin] = str[i];
str[i] = tmp;
}
}
}
}
}