题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
解题思路
利用递归的思想,将字符串看为第一个字符与后面所有的字符,依次递归计算出可能的排列,还是图好说话:
C++
class Solution {
public:
vector<string> Permutation(string str) {
if(str.length() == 0)
return result;
PermutationCore(str, 0);
return result;
}
private:
void PermutationCore(string str, int begin){
//递归结束的条件:第一位与最后一位完成交换
if(begin == str.size()){
result.push_back(str);
return;
}
for(int i = begin; i < str.size(); i++)
{
//如果字符创相同则不用交换
if(i != begin && str[begin] == str[i])
continue;
//交换位置
swap(str[i], str[begin]);
//递归调用,前面begin+1的位置不变,后面的字符串全排列
PermutationCore(str, begin+1);
}
}
vector<string> result;
};
Python
# -*- coding:utf-8 -*-
class Solution:
def Permutation(self, ss):
# write code here
#集合能避免重复
out = set()
if len(ss) == 0:
return out
charlist = list(ss)
self.permutation(charlist, 0, out)
return sorted(list(out))
def permutation(self, ss, begin, out):
if begin == len(ss)-1:
#join函数将列表中的字符按‘’中的字符进行连接
out.add(''.join(ss[:]))
else:
for i in range(begin, len(ss)):
#如果是重复字符,跳过
if ss[begin] == ss[i] and begin != i:
continue
else:
#依次与后面的交换
ss[begin], ss[i] = ss[i], ss[begin]
self.permutation(ss, begin+1, out)
#回到上一个状态
ss[begin], ss[i] = ss[i], ss[begin]