kotlin を使用してバックトラッキングによる電話番号の文字の組み合わせの問題を解決する

17. 電話番号のアルファベットの組み合わせ

中程度の難易度

2474

数値のみを含む文字列を指定すると 2-9 、それが表すことができる文字の可能な組み合わせをすべて返します。回答は任意の順序で返すことができます  。

数字と文字のマッピングは次のようになります (電話キーの場合と同じ)。1 はどの文字にも対応しないことに注意してください。

例 1:

入力:数字 = "23"
出力: ["ad","ae","af","bd","be","bf","cd","ce","cf"]

例 2:

入力:数字 = ""
出力: []

例 3:

入力:数字 = "2"
出力: ["a","b","c"]

ヒント:

  • 0 <= digits.length <= 4
  • digits[i]['2', '9'] 範囲内の数値 です 。

パス 696,168 コミット 1,198,761

 答え:

まず、数字を対応する文字の組み合わせにマッピングするアルファベットを定義します。次に、結果セットが定義されますresult関数ではletterCombinations、まず特殊な場合を判断し、数値文字列が空の場合は空のリストを返します。それ以外の場合は、トレースバック関数の再帰呼び出しを開始しますbacktrack

バックトラッキング関数では、最初に数値文字列の終わりに到達したかどうかを判断し、到達した場合は、現在結合されている文字列を結果セットに追加します。それ以外の場合は、現在の数値に対応する文字の組み合わせを取得し、文字ごとにそれを結合文字列に追加し、関数をbacktrack再帰的に呼び出して、最後に結合文字列から文字を削除します (前のステップに戻ります)。

このようにして、バックトラッキング関数が戻ったときに、すべての文字の組み合わせを取得できます。

class Solution {
     private val letterMap = arrayOf("", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz")
    private val result = mutableListOf<String>()
    fun letterCombinations(digits: String): List<String> {
        if (digits.isEmpty()) {
            return emptyList()
        }
        backtrack(digits, 0, StringBuilder())
        return result
    }
    private fun backtrack(digits: String, index: Int, combination: StringBuilder) {
        if (index == digits.length) {
            result.add(combination.toString())
            return
        }
        val digit = digits[index].toString().toInt()
        val letters = letterMap[digit]
        for (i in letters.indices) {
            combination.append(letters[i])
            backtrack(digits, index + 1, combination)
            combination.deleteCharAt(combination.length - 1)
        }
    }
}

バックトラッキング法は暴力的な解決法ですが、興味深いことに、繰り返しも漏れもなく、網羅的ではありますが、状況に応じた結果がすべて収集されています。すべてのバックトラッキング方法をマスターすると、数独というゲームは無意味になります。

おすすめ

転載: blog.csdn.net/weixin_41579872/article/details/130911232