题目来源于九章算法旗下的刷题平台
描述
给出一个字符串,找到它的所有排列,注意同一个字符串不要打印两次。 请以字典序从小到大输出。 0<=n<=20
示例
样例 1:
输入:“abb”
输出:
[“abb”, “bab”, “bba”]
样例 2:
输入:“aabb”
输出:
[“aabb”, “abab”, “baba”, “bbaa”, “abba”, “baab”]
思路分析
直接回溯即可,注意判断同一个位置同样的字母只能放置一次。
代码解析
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
vector<string> vec_str;
void backroute(const string& str, string& ans,int *visited)
{
int count = 0;
for (int i = 0; i < str.size(); ++i)
if (visited[i] == 1)
count++;
else
break;
//已经存在一组解
if (count >= str.size()) {
vec_str.push_back(ans);
return;
}
else {
char temp = '+';
for (int i = 0; i < str.size(); ++i) {
if (visited[i] == 0 && str[i] != temp) {
ans += str[i];
visited[i] = 1;
backroute(str, ans,visited);
visited[i] = 0;
temp = str[i];
ans.erase(ans.end() - 1);
}
}
}
}
int main()
{
string str = "", ans = "";
cin >> str;
int *visited = new int[str.size()];
for (int i = 0; i < str.size(); ++i)
visited[i] = 0;
backroute(str, ans,visited);
sort(vec_str.begin(), vec_str.end());
for (auto it : vec_str)
cout << it << " ";
return 0;
}