字符串的排列(二十七)
题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc
,则打印出由字符 a,b,c
所能排列出来的所有字符串 abc,acb,bac,bca,cab
和 cba
。
代码(已在牛客上 AC)
先对字符串排序, 要产生全排列, 需要不断交换字符, 由于字符串中可能含有相同的字符, 因此注意将它们略过.
(注意: 由于 DFS 的缘故, 可能最后会加上 std::swap(str[start], str[i]);
, 即代码最后将字符给交换回来. 实际上这是不必要的, 如果加上了这句代码, 反而通不过测试用例, 这是因为最后要将产生的字符串按照字典序输出.
class Solution {
public:
vector<string> Permutation(string str) {
if (str.empty()) return {};
vector<string> res;
string cur;
std::sort(str.begin(), str.end());
Permutation(str, res, 0);
return res;
}
private:
void Permutation(string str, vector<string> &res, int start) {
if (start >= str.size()) {
res.push_back(str);
return;
}
for (int i = start; i < str.size(); ++i) {
if (i > start && str[i] == str[start]) continue;
std::swap(str[start], str[i]);
Permutation(str, res, start + 1);
}
}
};