文章目录
1079. 活字印刷
你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。
注意:本题中,每个活字字模只能使用一次。
示例 1:
输入:"AAB"
输出:8
解释:可能的序列为 "A", "B", "AA", "AB", "BA", "AAB", "ABA", "BAA"。
示例 2:
输入:"AAABBC"
输出:188
示例 3:
输入:"V"
输出:1
提示:
- 1 <= tiles.length <= 7
- tiles 由大写英文字母组成
解题思路
就是有重复数字的全排列子集问题
- 涉及去重,所以先排序
- 注意树层去重和树枝去重
- 结果不含空集,所以最后结果减去1
Go代码
func numTilePossibilities(tiles string) int {
if len(tiles) == 0 {
return 0
}
res := 0
used := make([]bool,len(tiles))
// 要去重,所以先排序
tilesByte := []byte(tiles)
sort.Slice(tilesByte,func(i,j int) bool {
return tilesByte[i] < tilesByte[j]
})
tiles = string(tilesByte)
backtrack(tiles,&res,"",used)
return res - 1 // 包含了一个空集,所以减去1
}
func backtrack(tiles string,res *int,path string,used []bool) {
*res++
for i := 0;i < len(tiles);i++ {
// 相同字符,前一个未用时,后一个不可用,树层去重
if i > 0 &&tiles[i] == tiles[i-1] && !used[i - 1]{
continue
}
// 树枝去重
if used[i]{
continue
}
used[i] = true
backtrack(tiles,res,path + string(tiles[i]),used)
used[i] = false
}
}

1021

被折叠的 条评论
为什么被折叠?



