剑指Offer 38. 字符串的排列(Medium)

题解

  1. 字符串的排列(回溯法,清晰图解)

思路

先依次排好所有不重复的字符的位置顺序,再依次考虑剩余的重复字符的位置顺序,排完一遍所有字符则得到一种唯一的排列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

class Solution:
    ### 1107 回溯法(104 ms	18.7 MB)
    ### 思想:先依次排好所有不重复的字符的位置顺序,再依次考虑剩余的重复字符的位置顺序,排完一遍所有字符则得到一种唯一的排列
    def permutation(self, s: str) -> List[str]:
        c_ls, res = list(s), []               # c_ls中字符的位置会根据dfs的运行情况发生变化,但其字符数量不变

        def dfs(x: int) -> None:
            if x == len(s) - 1:               # 当前字符c_ls[x]是否是最后一个字符,若是则只存在唯一情况,则直接返回当前排列
                res.append(''.join(c_ls))     # 记录当前递归所形成的唯一排列
                return

            c_set = set()                     # 每次递归都定义一个集合c_set,用于存放在本次递归中、x之前的、已经固定好的字符的集合
            for i in range(x, len(s)):        # 循环从本次递归的起始字符下标x开始,到字符串中的最后一个字符
                if c_ls[i] in c_set: continue # 若当前字符和之前已有的字符串中的字符相同,则跳过当前字符,判断下一个字符
                c_set.add(c_ls[i])            # 若当前字符和之前不重复,则添加进本次的字符集合c_set中,用来记录已经使用的字符
                c_ls[i], c_ls[x] = c_ls[x], c_ls[i] # 交换当前字符c_ls[i]和本次递归的起始字符c_ls[x],用于固定当前字符c_ls[i](占位),以便确定最后的排列
                dfs(x+1)                            # 使用递归固定下一个字符c_ls[x+1]
                c_ls[i], c_ls[x] = c_ls[x], c_ls[i] # 当前字符c_ls[i]占位结束,则交换回原来的位置,保证原有的顺序

        dfs(0) # 从第一个字符开始依次固定后面的每一位字符,每固定完一遍所有字符,则得到一种唯一情况,并使用join方法生成字符串保存在res中
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值