【Leetcode】17. 电话号码的字母组合

文章目录

一. 题目信息

1. 描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
题目链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

2. 示例

示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例2:
输入:digits = ""
输出:[]

二. 解法

1. 回溯

算法思路:按照电话号码从前到后进行递归回溯

①. 复杂度分析

  • 时间复杂度:O(3^m * 4^n),其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),n 是输入中对应 4 个字母的数字个数(包括数字 7、9),m+n 是输入数字的总个数。
  • 空间复杂度:O(m+n)

②. c++解法

class Solution {
public:
    unordered_map<char, string> table = {
        {'2', "abc"},
        {'3', "def"},
        {'4', "ghi"},
        {'5', "jkl"},
        {'6', "mno"},
        {'7', "pqrs"},
        {'8', "tuv"},
        {'9', "wxyz"}
    };
    vector<string> letterCombinations(string digits) {
        vector<string> colum;
        string item;
        if (digits.length() == 0) return colum;
        backtrace(digits, colum, 0, item);
        return colum;
    }
    void backtrace(string& digits, vector<string>& colum, int index, string& item) {
        if (index == digits.length()) colum.push_back(item);
        else {
            string s = table.at(digits[index]);
            for (const char& c : s) {
                item.push_back(c);
                backtrace(digits, colum, index + 1, item);
                item.pop_back();
            }
        }
    }
};
上一篇:LeetCode 加一


下一篇:Leetcode —— 17. 电话号码的字母组合(Java)