42 字符串的排列--剑指offer--python实现

1. 题目描述

  描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

2. 题目解析

2.1 考察问题

  本问题考察的是全排列问题。

  1. 全排列问题最经典的解法就是递归实现。
  2. 注意到题目中说有重复字符,那么就需要对全排列字符串进行过滤。
  3. 输出按照字典序,需要进行一次排

2.2 解决方法

  1. 递归穷举,map过滤
      用递归的方式将所有的可能排列找出来,同时放入一个hashmap中,过滤重复的字符串。
      时间复杂度 O ( n ! ) O(n!) O(n!),空间复杂度 O ( n ) O(n) O(n)

  2. 字典排序算法
      这个方法需要深入思考一下,目前没有理解。

2.3 优化分析

  递归算法通过穷举来完成,字典排序算法更加简单,但理解起来比较复杂,这个实现后边继续补充。

3. 代码实现

3.1 递归穷举,map过滤

# -*- coding:utf-8 -*-
class Solution:
    list_sorted = []### 由于每一次都要重复使用
    def Permutation(self, ss):
        self.list_sorted = [] ### 所以首次使用的时候必须初始化为空
        self.PerHelper(list(ss), 0, len(ss)-1)
        self.list_sorted.sort()
        return self.list_sorted

    def PerHelper(self, ss, start, end):
        if end < start:
            return
        if end == start:
            if not self.list_sorted.count("".join(ss)): # 0 表示 False
                self.list_sorted.append("".join(ss))
            return

        for i in range(start, end+1):
            ss[start], ss[i] = ss[i], ss[start]
            self.PerHelper(ss, start + 1, end)
            ss[start], ss[i] = ss[i], ss[start]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值