返回

[Leetcode]17. Letter Combinations of a Phone Number(C++)

题目描述

题目链接:17. Letter Combinations of a Phone Number

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

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

例子

例子 1

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

例子 2

Input: digits = "" Output: []

例子 3

Input: digits = "2" Output: ["a","b","c"]

Constraints

  • 0 <= digits.length <= 4
  • digits[i] is a digit in the range ['2', '9']

解题思路

使用一个哈希表创建数字到字母间的map,接下来用回溯法进行暴力遍历选出所有的字母组合即可,每一次循环遍历当前数字的所有字母。代码如下:

#include <string>
#include <vector>

class Solution {
public:
    std::vector<std::string> letterCombinations(std::string digits) {
        if (digits.empty()) return {};
        std::vector<std::string> nums{"",    "abc",  "def", "ghi", "jkl",
                                      "mno", "pqrs", "tuv", "wxyz"};
        std::string combination;
        std::vector<std::string> result;
        iterate(nums, 0, digits, combination, result);
        return result;
    }

private:
    void iterate(const std::vector<std::string>& nums, int idx,
                 const std::string& digits, std::string& combination,
                 std::vector<std::string>& result) {
        if (idx == digits.length()) {
            result.push_back(combination);
            return;
        }

        int digit = digits[idx] - '0' - 1;
        for (int i = 0; i < nums[digit].length(); i++) {
            combination.push_back(nums[digit][i]);
            iterate(nums, idx + 1, digits, combination, result);
            combination.pop_back();
        }
    }
};
  • 时间复杂度: O((3~4)^n) 3 和 4 是每个数字可能对应的字母数字,n 为 digits 长度
  • 空间复杂度: O((3~4)^n)

GitHub 代码同步地址: 17.LetterCombinationsOfAPhoneNumber.cpp

其他题目: GitHub: Leetcode-C++-Solution 博客: Leetcode-Solutions

Built with Hugo
Theme Stack designed by Jimmy