【剑指Offer】 27.字符串的排列

题目描述

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

用例

输入输出
abc不加sort[‘abc’, ‘acb’, ‘bac’, ‘bca’, ‘cba’, ‘cab’]
abc加sort[‘abc’, ‘acb’, ‘bac’, ‘bca’, ‘cab’, ‘cba’]
abcd不加sort[‘abcd’, ‘abdc’, ‘acbd’, ‘acdb’, ‘adcb’, ‘adbc’, ‘bacd’, ‘badc’, ‘bcad’, ‘bcda’, ‘bdca’, ‘bdac’, ‘cbad’, ‘cbda’, ‘cabd’, ‘cadb’, ‘cdab’, ‘cdba’, ‘dbca’, ‘dbac’, ‘dcba’, ‘dcab’, ‘dacb’, ‘dabc’]
abcd加sort[‘abcd’, ‘abdc’, ‘acbd’, ‘acdb’, ‘adbc’, ‘adcb’, ‘bacd’, ‘badc’, ‘bcad’, ‘bcda’, ‘bdac’, ‘bdca’, ‘cabd’, ‘cadb’,== ‘cbad’==, ‘cbda’, ‘cdab’, ‘cdba’, ‘dabc’, ‘dacb’, ‘dbac’, ‘dbca’, ‘dcab’, ‘dcba’]

解题思路

思路:回溯法,也可以直接使用库函数
这道题要注意两个问题:
  第一个是重复字母,第二个是按字典顺序
在这里插入图片描述

python 两种解法


回溯法

# -*- coding:utf-8 -*-
class Solution:
    def Permutation(self, ss):
        resultList = []
        if len(ss) == 0:
            return resultList
        track = []
        visit = [0]*len(ss)
        self.backtrack(list(ss),track,resultList,visit)
        resultList.sort()
        return resultList
    
    # 回溯算法
    def backtrack(self, nums, track, resultList,visit):
        # 触发结束条件
        if len(track) == len(nums):
        	# 例如:"aa"对应输出应该为["aa"]
            if "".join(track) not in resultList:
                resultList.append("".join(track))
                return
        for i in range(len(nums)):
            if visit[i] == 1:
                continue
            visit[i] = 1
            # 做选择
            track.append(nums[i])
            # 进入下一层决策树
            self.backtrack(nums, track, resultList,visit)
            # 取消选择,返回上一层决策树
            track.pop()
            # 
            visit[i] = 0                                     
                                                                                                                                                                                                
s = Solution()                                                                                             
result = s.Permutation("abc")                                                                              
print(result)                                                                                              

使用库函数

# -*- coding:utf-8 -*-
import itertools
class Solution:
    def Permutation(self, ss):
        # write code here
        result=[]
        if not ss:
            return []
        else:
            res=itertools.permutations(ss)
            for i in res:
                if "".join(i) not in result:
                    result.append("".join(i))
        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值