zoukankan      html  css  js  c++  java
  • [Leetcode] Letter Combinations of a Phone Number

    Letter Combinations of a Phone Number 题解

    题目来源:https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/


    Description

    Given a digit string, 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.

    img

    Example

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

    Note:

    Although the above answer is in lexicographical order, your answer could be in any order you want.

    Solution

    
    class Solution {
    public:
        vector<string> letterCombinations(string digits) {
            if (digits.empty())
                return vector<string>();
            vector<string> alphaMap = {
                    " ",
                   " ", "abc", "def",
                   "ghi", "jkl", "mno",
                   "pqrs", "tuv", "wxyz"
            };
            auto n = digits.size();
            vector<vector<string> > dp(n + 1);
            dp[0] = vector<string>{""};
            int i;
            for (i = 0; i < n; i++) {
                const string& alphas = alphaMap[digits[i] - '0'];
                for (auto c : alphas) {
                    for (auto str : dp[i]) {
                        dp[i + 1].push_back(str + c);
                    }
                }
            }
            return dp.back();
        }
    };
    
    
    

    解题描述

    这道题题意是给出一个数字串,然后根据数字串在九宫格键盘上的位置找出所有可能的字母组合。解法上用到的是类似哈希和DP的办法。

    不过这道题还可以用回溯的办法来解决,可以减少空间消耗,时间复杂度是差不多的:

    
    class Solution {
    private:
        vector<string> alphaMap;
    public:
        vector<string> letterCombinations(string digits) {
            vector<string> res;
            if (digits.empty())
                return res;
            alphaMap = {
                    " ",
                    " ", "abc", "def",
                    "ghi", "jkl", "mno",
                    "pqrs", "tuv", "wxyz"
            };
            string path;
            backTracking(res, path, digits, 0);
            return res;
        }
    
        void backTracking(vector<string>& res, string& path, const string& digits, int index) {
            if (index == digits.size()) {
                res.push_back(path);
            } else {
                const string& alphas = alphaMap[digits[index] - '0'];
                for (auto c : alphas) {
                    path.push_back(c);
                    backTracking(res, path, digits, index + 1);
                    path.pop_back();
                }
            }
        }
    };
    
    
  • 相关阅读:
    UVA
    BZOJ 2330: [SCOI2011]糖果
    人类的殒落与扬升
    算法笔记2
    算法笔记
    回溯法
    贪心法
    动态规划
    分治与递归
    计算机图形学 补 光线跟踪
  • 原文地址:https://www.cnblogs.com/yanhewu/p/8397757.html
Copyright © 2011-2022 走看看