剑指offer 字符串的排列
问题描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
C++代码实现
思路:固定一端,后面的交换位置,遍历到尾部时,插入
class Solution {
public:
vector<string> Permutation(string str) {
if (str.empty())
{
return {};
}
set<string> s;
perm(0, str, s);
return vector<string>(s.begin(), s.end());
}
void perm(int pos, string str, set<string> &s)
{
if (pos+1 == str.length())
{
s.insert(str);
return;
}
for (int i = pos; i < str.length(); i++)
{
swap(str[pos], str[i]);
perm(pos+1, str, s);
// 回溯
swap(str[pos], str[i]);
}
}
};
python2代码实现
# -*- coding:utf-8 -*-
class Solution:
def Permutation(self, ss):
# write code here
length = len(ss)
if length <= 1:
return ss
lists = []
for i in range(length):
first_str = ss[i]
# 这里的ss[:i]+ss[i+1:] 刚好把ss[i]扣出来
for temp_sub_list in self.Permutation(ss[:i]+ss[i+1:]):
temp = first_str + temp_sub_list
if temp not in lists:
lists.append(temp)
return lists