活字印刷 回溯剪枝

pardon110發表於2020-12-10

活字印刷

你有一套活字字模 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 協議》,轉載必須註明作者和本文連結

相關文章