zoukankan      html  css  js  c++  java
  • 算法练习--LeetCode--17. Letter Combinations of a Phone Number

    1. Letter Combinations of a Phone Number
      Medium

    Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.

    A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.

    1o-o_ 2abc 3def
    4ghi_ 5jkl 6mno
    7pqrs 8tuv 9wxyz
    *+___ 0___ #↑__

    除了0的第一个“”以外的位置的“”是为了对齐

     
    我觉得上面那玩意儿不如图

    Example:

    Input: "23"
    Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]

    大意是指要把输入的数字按照手机键盘的映射关系转成可能的字符串

    • 不要有重复的
    • 不用在意字符串顺序(输出结果数组的排序)

    Note:

    虽然题目中给出输入数字在[2, 9],实测(2019-01-05) 01也有对应的映射关系

    0 => " "
    1 => "*"

    基本分析:

    • 要求长度为n的结果,首先要求长度为n-1的结果!
    • n == 1 时候结果是已知的
            "0" : [" "],
            "1" : ["*"],
            "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(s: String) -> [String] {
      if s 为空字符串, return 空数组
        if cache 不包含 s {
          cache[s] = cache[s的第一个字符] * letterCombinations(s除了第一字符以外剩下的部分的结果)
        }
      return cache[s]
    }

    代码

    // Swift Code
    class Solution {
        var cache: [String : [String]] = [
            "0" : [" "],
            "1" : ["*"],
            "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.isEmpty { return [] }
            if !cache.keys.contains(digits) {
                cache[digits] = letterCombinations(String(digits.prefix(1))).flatMap({ (s) -> [String] in
                    letterCombinations(String(digits.suffix(digits.count - 1))).map { s + $0 }
                })
            }
            return cache[digits]!
        }
    }

    TestCase

    • ""
    • "23"
    • "203"
    • "213"
  • 相关阅读:
    Xamarin.Android和UWP之MVVM的简单使用(二)
    Xamarin.Android和UWP之MVVM的简单使用(一)
    那些年用过的xUnit.net的简单用法
    Xamarin.Android之给我们的应用加点过渡效果
    Xamarin.Android之Splash的几种简单实现
    Xamarin.Android之布局文件智能提示问题
    Xamarin.Android之Spinner的简单探讨
    Xamarin.Android之封装个简单的网络请求类
    Xamarin.Android再体验之简单的登录Demo
    【分库分表】sharding-jdbc实践—分库分表入门
  • 原文地址:https://www.cnblogs.com/kongkaikai/p/10223216.html
Copyright © 2011-2022 走看看