字符串的排列

本文介绍了如何对输入字符串进行全排列,并解决排列中重复元素的问题。通过递归和深度优先遍历(DFS)实现字符串的全排列,对于有重复字符的情况,提出了两种去重策略:一是最后结果中去重,二是直接排序使重复元素相邻。同时提供了代码示例和去重的完整解决方案。
摘要由CSDN通过智能技术生成

题目描述

思路详解

代码

附录

去重的问题

(1)在最后的结果中去重

         (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(不包括重复字符)的字符串,共有\frac{n(1+n)}{2}种排列方式。

【注意】

(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之前的字母都已经固定࿰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值