【数据结构与算法】之电话号码键盘的字母组合算法

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

一、题目要求
  • 给出数字到字母的映射如下(与电话按键相同)。
    注意: 1 不对应任何字母。

在这里插入图片描述

  • 示例如下:
	输入:"23"
	输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
  • 说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
二、算法示例
  • 思路
    • 解决这个问题的思路比较简单,字符串每一个数字对于有多种字母, 比如 2 对应: abc 3 个,3对应:def 3 个, 4对应:ghi 3个,那么 234 对应是 3 * 3 * 3 钟组合,归结与代码就是 3 层 for 循环。也就是说 digits.count 决定多少层 for 循环,那么对应 N 层 for 循环是嵌套的,采用递归的方式进行是比较好的处理方式。
    • 构建递归函数的时候仍然是依据 for 循环的思想,不同的地方是递归函数的退出机制,以及相应字母的组合和采集条件;以及子循环的 index 的处理。
  • Swift 示例一
	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 示例二
	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
今日推荐