天池在线编程 字符串的不同排列

题目来源于九章算法旗下的刷题平台


描述
给出一个字符串,找到它的所有排列,注意同一个字符串不要打印两次。 请以字典序从小到大输出。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/109154162