活字印刷
你有一套活字字模 tiles
,其中每個字模上都刻有一個字母 tiles[i]
。返回你可以印出的非空字母序列的數目。
輸入:"AAB"
輸出:8
解釋:可能的序列為 "A", "B", "AA", "AB", "BA", "AAB", "ABA", "BAA"。
分析
- 排序去重
- 全排列計數
- 回溯剪枝
上碼
func numTilePossibilities(tiles string) int {
var cnt int
var backtrace func([]byte, []bool)
N := len(tiles) // 計算位元組數
by := []byte(tiles) // 排序方便去重
sort.Slice(by,func(i,j int)bool{
return by[i] < by[j]
})
// 全排列
backtrace = func(path []byte, vis []bool){
if len(path) == N {
return
}
for i:=0;i < N;i++{
if vis[i] || i > 0 && by[i]==by[i-1] && !vis[i-1] {
continue
}
cnt++ // 此處計數,則包含子集全排列數
vis[i] = true
backtrace(append(path, by[i]),vis)
vis[i] = false
}
}
backtrace([]byte{},make([]bool, N))
return cnt
}
效能
提交時間 | 提交結果 | 執行時間 | 記憶體消耗 | 語言 |
---|---|---|---|---|
幾秒前 | 通過 | 0 ms | 1.9 MB | Go |
本作品採用《CC 協議》,轉載必須註明作者和本文連結