递归与回溯:17.电话号码的字母组合

2020-12-04  本文已影响0人  zmfflying

/**

题目

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

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
2 abc
3 def
4 ghi
5 jkl
6 mno
7 pqrs
8 tuv
9 wxyz

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

测试代码

print(letterCombinations("23"))

笔记

这道题的确是要使用递归的思想
首先定义好数字对应的字符串数组
然后把传入的字符串转为数组
每次都是拿当前字母对应的数组,暂时记录下来
接着是继续取到上次递归返回的数组
然后对这两个数组进行双层循环,取到本次递归获取到的最新的数组病返回

注意要判断下是不是递归到最后一个字母了
如果是最后一个字母,就返回这个字母在字典里对应的数组

代码地址

https://github.com/zmfflying/ZMathCode
*/

解题代码

import Foundation

func letterCombinations(_ digits: String) -> [String] {
    if digits.count == 0 {
        return []
    }
    //首先定义好数字对应的字符串数组
    let dic = ["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"]] as [Character: [String]]
    
    //递归方法 返回
    func help(strArr: Array<Character>?) -> [String] {
        var temp = strArr
        //取出第一个字母和它对应的字符串数组
        let first = temp?.removeFirst()
        let arr = dic[first!]!
        
        if strArr?.count == 1 {
            //递归到最后一个字母的时候,就直接返回取到的数据
            return arr
        }
        let arr1 = help(strArr: temp)
        
        //记录本次拼接好的数据
        var res: [String] = [String]()
        for s in arr {
            for s1 in arr1 {
                res.append("\(s)\(s1)")
            }
        }
        return res
    }
    
    //提前把字符串转为数组 Array<Character>
    return help(strArr: Array(digits))
}


上一篇下一篇

猜你喜欢

热点阅读