题目链接
输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。
回溯法
使用回溯法,本质将字符串看成多叉树的形式。
1、添加当前数据 2、剪枝(因为会存在重复的字符串) 3、DFS 4、回退一步
class Solution {
public:
bool IsExist(vector<string>& ret, string str)
{
for(auto i : ret)
{
if(i == str)
return true;
}
return false;
}
void swap(string& str, int start, int end)
{
char temp = str[start];
str[start] = str[end];
str[end] = temp;
}
void _Permutation(string& str, int start, vector<string>& ret)
{
if(start == str.size()-1)
{
if(!IsExist(ret, str))
{
ret.push_back(str);
return;
}
}
for(int i = start; i < str.size(); ++i)
{
swap(str, start, i);
_Permutation(str, start+1, ret);
swap(str, start, i);
}
}
vector<string> Permutation(string str) {
vector<string> result;
if(str.size() == 0)
return result;
_Permutation(str, 0, result);
return result;
}
};
|