一、题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
二、思路分析:
全排列问题分有重复和无重复情况,和N皇后问题是经典的回溯算法的应用。
回溯算法详解:https://leetcode-cn.com/problems/n-queens/solution/hui-su-suan-fa-xiang-jie-by-labuladong/
C++:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
private:
vector<string> result;
public:
void PermutationCore(string str, int begin) {
//递归结束的条件:第一位和最后一位交换完成
if (begin == str.length()) {
result.push_back(str);//路径
return;
}
//核心:for循环里的函数递归,以abc为例,共执行了16次PermutationCore函数
for (int i = begin; i < str.length(); i++) {
//如果字符串相同,则不交换
if (i != begin && str[i] == str[begin]) {
continue;
}
swap(str[begin], str[i]);//位置交换
PermutationCore(str, begin + 1);//递归调用
}
}
//字符串的排列(可能有重复问题)
vector<string> Permutation(string str) {
//全排列
//判断输入是否为空字符串
if (str.length() == 0) {
return result;
}
PermutationCore(str, 0); //全排列
//对结果进行排序,实现按字典序打印
sort(result.begin(), result.end());
return result;
}
};
int main() {
Solution obj;
obj.Permutation("abc");
}
核心代码的理解:https://blog.csdn.net/weixin_42148873/article/details/106058717
python:可使用内置函数permutations
# -*- coding:utf-8 -*-
from itertools import permutations
class Solution:
def Permutation(self, ss):
# write code here
if ss == '':#空字符串
return []
ans = set()#如果ans=[],则当有重复元素时,如permutations(‘aa’,2)得到的是('aa','aa')
for x in permutations(ss,len(ss)):#permutations('ABC',2)则x为('A','B'),('A','C'),('B','A')
ans.add(''.join(x))
return sorted(ans)
.如果x = [1,2,3],或x = (1,2,3),则 ''.join(x)会报错,即join只处理字符类型数据,如x = ['1','2','3'],''.join(x)结果为123