此题出自牛客网的剑指offer专题
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解题思路
该题主要的算法思想就是回溯法的运用。有一张图很好地说明了这个算法思路
代码如下
Java版本
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList<>();
if(str!=null && str.length()>0){
PermutationHelper(result,0,str.toCharArray());
Collections.sort(result);//保证按照字典序输出
}
return result;
}
public void PermutationHelper(ArrayList<String> result,int begin,char[] cs){
if(begin == cs.length-1){
String val = String.valueOf(cs);
//如果结果集中不包含这种情况则添加(防止重复)
if(!result.contains(val)){
result.add(val);
}
} else {
for(int j=begin;j<cs.length;j++){
swap(cs,j,begin);
PermutationHelper(result,begin+1,cs);
//回溯法的关键->复位
swap(cs,j,begin);
}
}
}
public void swap(char[] cs,int begin,int j){
char temp = cs[begin];
cs[begin] = cs[j];
cs[j] = temp;
}
}
C++版本
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> result;
if(str.length()==0)
{
return result;
}
PermutationHelper(result,str,0);
sort(result.begin(),result.end());//保持字典序
return result;
}
void PermutationHelper(vector<string> &result,string str,int begin)
{
if(begin == (int)str.length())
{
result.push_back(str);
return;
}
for(int i = begin;str[i]!='\0';i++)
{
if(i != begin && str[begin]==str[i])
{
continue;
}
swap(str[begin],str[i]);
PermutationHelper(result,str,begin+1);
swap(str[begin],str[i]);
}
}
};