【每日算法】剑指 Offer字符串的排列

题目描述


这是 LeetCode 上的 剑指 Offer 38. 字符串的排列

难度为 【中】

输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例 1:

输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]

提示:

1 <= s 的长度 <= 8
字符串中有可能会有重复的元素

代码实现

class Solution(object):
    def permutation(self, s):
    	s=list(s)
    	res=[]
    	n=len(s)
    	def dfs(step):
    		if step==n-1:
    			res.append(''.join(s))
    			return
    		dic=set()#记录重复的字符串
    		for i in range(step,n):
    			#比如第0位已经被字符a替换过,后面再有a的话就不再被替换了
    			#如果替换,则替换后的字符和之前的某个其他位置上的a替换的结果是一样的
    			if s[i] in dic:continue#如果某个字符串已经被访问过,则直接跳过
    			dic.add(s[i])
    			s[i],s[step]=s[step],s[i]
    			# print(''.join(s))
    			dfs(step+1)
    			s[step],s[i]=s[i],s[step]
    	dfs(0)
    	return res
posted @ 2021-08-03 17:28  Hitechr  阅读(22)  评论(0编辑  收藏  举报