字符串的排列
题目
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
思路:
(1)长度为n的字符串(字符互不相等),排列有n!种方案
(2)深度优先搜索所有排列方案:先固定第1位字符,再固定第二位字符,一直到第n位
(3)如果字符串有重复,排列中也会有,都用set解决。
C++
class Solution {
public:
vector<string> permutation(string s) {
set<string> res;
help(s, 0, res);
return vector<string>(res.begin(), res.end());
}
private:
void help(string& s, int start, set<string>& res)
{
if(start == s.size())
{
res.insert(s);
return ;
}
vector<bool> swapped(256, false);
for(int i=start; i< s.size(); ++i)
{
if(swapped[i]) //交换过就不用再交换
continue;
swapped[i] = true;
swap(s[start],s[i]); //依次固定该字符串的每一位
help(s, start+1, res);
swap(s[start], s[i]); //恢复成原字符串
}
}
};
python
class Solution:
def permutation(self, s: str) -> List[str]:
c = list(s)
res = []
def dfs(x):
if x == len(c) - 1:
res.append(''.join(c)) # 添加排列方案
return
dic = set()
for i in range(x, len(c)):
if c[i] in dic:
continue # 重复,因此剪枝
dic.add(c[i])
c[i], c[x] = c[x], c[i] # 交换,固定此位为 c[i]
dfs(x + 1) # 开启固定第 x + 1 位字符
c[i], c[x] = c[x], c[i] # 恢复交换
dfs(0)
return res