参考链接
- https://leetcode-cn.com/problems/permutation-i-lcci/
题目描述
无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。
解题思路
典型的全排列问题,用回溯法。但注意要求无重复字符,所以在填当前位置的字符时,需要判断前面是否出现过该字符。可以使用简单的遍历,也可以用哈希集合存储已经填过的字符。
代码
回溯法
class Solution {
public:
vector<string> answer;
vector<string> permutation(string S) {
string board;
backtrack(board, S);
return answer;
}
void backtrack(string& board, string& S)
{
if (board.size() == S.size())
{
answer.push_back(board);
return;
}
for (char s : S)
{
if (!isValid(board, s))
{
continue;
}
board.push_back(s);
backtrack(board, S);
board.pop_back();
}
}
bool isValid(string& board, char s)
{
for (int i = 0; i < board.size(); i ++)
{
if (board[i] == s)
{
return false;
}
}
return true;
}
};
使用哈希集合的回溯法
class Solution {
public:
vector<string> answer;
vector<string> permutation(string S) {
string board;
unordered_set<int> cur;
backtrack(board, S, cur);
return answer;
}
void backtrack(string& board, string& S, unordered_set<char>& cur)
{
if (board.size() == S.size())
{
answer.push_back(board);
return;
}
for (char s : S)
{
if (cur.count(s) == 1)
{
continue;
}
board.push_back(s);
cur.insert(s);
backtrack(board, S, cur);
cur.erase(s);
board.pop_back();
}
}
};