你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。
示例 1:
输入:"AAB"
输出:8
解释:可能的序列为 "A", "B", "AA", "AB", "BA", "AAB", "ABA", "BAA"。
示例 2:
输入:"AAABBC"
输出:188
提示:
1 <= tiles.length <= 7
tiles 由大写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-tile-possibilities
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution(object):
def numTilePossibilities(self, tiles):
"""
:type tiles: str
:rtype: int
"""
# 分两步 1.找到子集 2.找到所有子集的全排列
tiles=sorted(tiles) #返回list
res1=[]
self.count=0
def help1(tiles,start,temp):
'''
找到 子集
'''
res1.append(temp)
for i in range(start,len(tiles)):
# 添加当前元素前 去重
if i>start and tiles[i]==tiles[i-1]:continue
temp+=tiles[i]
# 递归
help1(tiles,i+1,temp)
# 回溯
temp=temp[:-1]
def help2(in_str,start):
'''
找全排列
'''
if start==len(in_str)-1:
self.count+=1
return
used=set()
for i in range(start,len(in_str)):
# 去重判断此元素是否已经交换过
if in_str[i] not in used:
# 交换元素位置
used.add(in_str[i])
in_str[i],in_str[start]=in_str[start],in_str[i]
# 递归
help2(in_str,start+1)
# 回溯 还原位置
in_str[i],in_str[start]=in_str[start],in_str[i]
help1(tiles,0,'')
# 去掉''
res1.remove('')
for in_str in res1:
help2(list(in_str),0)
return self.count