leetcode 字符串的排列(循环以及递归)

一、题目描述

在这里插入图片描述

二、思路以及代码

递归思路:

分解字符串,将其视为第一个字符和其余字符的组合,利用这个函数反复得到
首字母+其余字符串的全排列,直到其余字符串长度为1返回。
最终利用list(set(lst))对lst去重。
理解简单,书写便捷,缺点是耗时较久。

class Solution:
    #递归
    def permutation(self, s: str):
        if len(s)==1:
            return [s]
        lst=[]
        for index in range(len(s)):
            rets=self.permutation(s[:index]+s[index+1:])
            for ret in rets:
                lst.append(s[index]+ret)
        return list(set(lst))

循环思路

参考了“he___jia”的题解,笔者手写代码。
主要思路是:
从一个字符开始,每轮循环增加一个字符,
在之前字符全排列的基础上逐空插入下一个字符,最终得到多一个字符的全排列,循环下去,得到所有字符的全排列。

class Solution:
    #循环
    def permutation(self, s: str):
        rets=set(s[0])
        index,l=1,len(s)
        #循环开始
        while(index<len(s)):
            temp=set()
            for ret in rets:
                for j in range(len(ret)+1):
                    string=ret[:j]+s[index]+ret[j:]
                    temp.add(string)
            index+=1
            rets=temp
        return list(rets)

三、执行用时比较

笔者手写的递归740ms,循环76ms(原循环题解作者为40ms,膜拜)。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值