(2)直接对输入的字符串进行排序,让重复的元素都在相邻的位置
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路详解
(1)递归中的循环!!!!---实现每一个位置取遍所有剩余的元素
将一个字符串看成两部分,第一部分是它的第一个字节,第二部分是剩下的字节
(2)深度优先遍历(DFS)
先固定第一个字符,然后递归剩余字符的全排列
递归中通过循环遍历当前子字符串第一位置b的所有可能值(b之后位置的字符都有可能作为b的取值,所以每次循环的时候交换一下位置):
位置 |
0 | 1 | 2 | 3 |
可能的取值个数 | 4 | 3 | 2 | 1 |
所以对于长度为n(不包括重复字符)的字符串,共有种排列方式。
【注意】
(1)考虑有重复字符的情况:例如“aa”
在递归的for循环中加入continue的条件(只可以去除相邻元素的重复,所以要保证输入的字符串是有序的,这样做才能保证结果没有重复序列),如果输入的字符串无序需要先排个序,详见附录。
(2)递归函数中:
/*
str: 每次递归保存一份,维护的是当前的排列顺序(b之前的字母都已经固定好)
b:b之前的字母都已经固定,本次函数中要固定b位置的字母(还有多少个位置没有固定,b位置就有多少种可能)
*/
代码
class Solution {
vector<string> res;
public:
vector<string> Permutation(string str) {
if(str.size() == 0)
return res;
helper(str, 0);
return res;
}
/*
str: 每次递归保存一份,维护的是当前的排列顺序(b之前的字母都已经固定好)
b:b之前的字母都已经固定&#x