题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串
a
b
c
abc
abc,则打印出由字符
a
,
b
,
c
a,b,c
a,b,c所能排列出来的所有字符串
a
b
c
,
a
c
b
,
b
a
c
,
b
c
a
,
c
a
b
和
c
b
a
abc,acb,bac,bca,cab和cba
abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:分为两步:
- 1)求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。
- 2)固定第一个字符,求后面所有字符的排列。
- 然后将后面的字符也可以看作原字符,用上面的两步来计算
(注意排列出来的序列可能无序、有重复等,因此需要对获得的排列组合进行排序、去重等操作)
class Solution {
public:
vector<string> vec;
vector<string> Permutation(string str) {
if (str.empty())
return vec;
Permutation(str, 0);
sort(vec.begin(), vec.end()); //排序
auto it = unique(vec.begin(), vec.end()); //去重
vec.erase(it, vec.end());
return vec;
}
void Permutation(string str, int length) {
if (length == str.size() - 1)
vec.push_back(str);
for (int i = length; i < str.size(); ++i) {
//第一步:固定第一个字符,然后交换
swap(str[i], str[length]);
//将后面的字符看作原字符,进行排列组合
Permutation(str, length + 1);
swap(str[i], str[length]);
}
}
};