@ 剑指offer(python)字符串的排列

剑指offer刷题笔记27(python)

题目描述

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

思路1

这个题可以看出成字符串的全排列,全排列,我在另一篇博客里做了说明Python 递归和非递归实现全排列 (去重和不去重)

代码1

第一种方法是递归。递归有两种写法,一种是交换,另一种是下面这种写法。

# -*- coding:utf-8 -*-
class Solution:
    def Permutation(self, ss):
        # write code here
        list = []
        if len(ss) <= 1:
            return ss
        left = ss[0]
        right = self.Permutation(ss[1:])
        for word in right:
            for i in range(len(word)+1):
                if word[:i]+left+word[i:] not in list:       # 去重
                    list.append(word[:i]+left+word[i:])
        list.sort()      # 按字典序输出
        return list

ps:交换写法在另一篇博客里有解释。

思路2

第二种方法,是利用字典序的排序方法。在另外一篇博客里也做了说明。

代码2

# -*- coding:utf-8 -*-
class Solution:
    def Permutation(self, ss):
        # write code here
        res = []
        if ss == "":
            return res
        if len(ss) == 1:
            return [ss]
        strlist = []
        for i in range(len(ss)):
            strlist.append(ss[i])
        strlist.sort()
        res.append("".join(strlist))
        size = len(strlist)
        while True:
            p = size - 1
            while p >= 1 and strlist[p-1] >= strlist[p]:
                p -= 1
            if p == 0:
                break
            q = p
            p -= 1
            while q < size and strlist[q] > strlist[p]:
                q += 1
            q -= 1
            self.swap(strlist,p,q)
            self.reverse(strlist,p+1,size-1)
            res.append("".join(strlist))
        return res
    def swap(self,strlist,p,q):
        strlist[p],strlist[q] = strlist[q],strlist[p]
    def reverse(self,array,i,j):    # 元素反转函数
        if array is None or i < 0 or j < 0 or i >= j or len(array) < j + 1:
            return
        while i < j:
            self.swap(array,i,j)
            i += 1
            j -= 1 

你可能感兴趣的:(剑指offer(python))