方法一:dfs + 剪枝:时间O( n ! n! n!),空间O(n)
解题思路:
- 对字符串进行全排列,将每次不同排列的结构插入数组中
- 通过dfs + 循环遍历数组,并交换元素位置,实现全排列
- 全排列过程中可能出现数组中多个元素重复占用同一位置,造成结果重复
- 因此采用一个固定大小的数组,每排一次位置让元素对应下标++
class Solution {
public:
vector<string> ans;
vector<string> permutation(string s)
{
dfs(s, 0);
return ans;
}
void dfs(string& s, int pos)
{
// 直接对 s 进行全排列
if (pos == s.size() - 1)
{
ans.push_back(s);
return;
}
int board[1024] = { 0 };
for (int i = pos; i < s.size(); ++i)
{
if (board[s[i]] != 0)
continue;
board[s[i]]++;
swap(s[i], s[pos]);
dfs(s, pos + 1);
swap(s[i], s[pos]);
}
}
};