【データ構造とアルゴリズム】電話番号キーボードの文字組み合わせアルゴリズム

2〜9の数字のみを含む文字列を指定すると、それが表すことができるすべての文字の組み合わせを返します。

1.対象要件
  • 数字と文字のマッピングは次のとおりです(電話ボタンと同じ)。
    注:1はどの文字にも対応していません。

ここに画像の説明を挿入

  • 次に例を示します。
	输入:"23"
	输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
  • 注:上記の回答は辞書式順序で並べられていますが、回答が出力される順序を選択できます。
2、アルゴリズムの例
  • アイデア
    • この問題を解決するアイデアは比較的単純です。たとえば、文字列の各数値には複数の文字があります。たとえば、2は次のように対応します:3 abc、3は3 defに対応し、4は3 ghiに対応し、234は3 * 3 * 3に対応しますコードにまとめたクロックの組み合わせは、3層のforループです。つまり、digits.countはforループのレベル数を決定し、対応するforループのNレベルがネストされます。再帰的な方法を使用することをお勧めします。
    • 再帰関数の構築は、依然としてforループの考え方に基づいています。違いは、再帰関数の終了メカニズム、対応する文字と収集条件の組み合わせ、およびサブループのインデックスの処理です。
  • Swiftの例1
	var listRes = [String]()

    let map : [Character:[Character]] = {
    
    
      return ["2":Array("abc"),
              "3":Array("def"),
              "4":Array("ghi"),
              "5":Array("jkl"),
              "6":Array("mno"),
              "7":Array("pqrs"),
              "8":Array("tuv"),
              "9":Array("wxyz")
              ]
    }()

    func letterCombinations(_ digits: String) -> [String] {
    
    
      if digits.count == 0 {
    
    
        return []
      }
      search("", Array(digits), 0)
      return listRes  
    }

    func search(_ s:String,_ digits: [Character],_ index:Int) {
    
    
      //! 1.terminator
      if index==digits.count {
    
    
        listRes.append(s)
        return
      }
    
      //! 2. process
      let letters = map[digits[index]]!
      for j in 0..<letters.count {
    
    
        //! drill down
        search(s+String(letters[j]), digits, index+1)
      }
  }
  • Swiftの例2
	let matchTable: [Int : [String]] = [2 : ["a", "b", "c"],
                                        3 : ["d", "e", "f"],
                                        4 : ["g", "h", "i"],
                                        5 : ["j", "k", "l"],
                                        6 : ["m", "n", "o"],
                                        7 : ["p", "q", "r", "s"],
                                        8 : ["t", "u", "v"],
                                        9 : ["w", "x", "y", "z"]]
    
    func letterCombinations(_ digits: String) -> [String] {
    
    
        if digits == "" {
    
    
            // 避免map的时候返回 [""]
            return []
        }
        // Set中任何元素只出现一次
        var ret: Set<String> = []
        var i = 0
        while i < 5000 {
    
    
            var str = ""
            for c in digits {
    
    
                let val = Int(String(c))!
                // 取随机内容
                str += matchTable[val]!.randomElement()!
            }
            ret.insert(str)
            i += 1
        }
        return ret.map {
    
     (str) -> String in
            return str
        }
    }

おすすめ

転載: blog.csdn.net/Forever_wj/article/details/108655421
おすすめ