zoukankan      html  css  js  c++  java
  • LeetCode: 17. Letter Combinations of a Phone Number

    题目:
    LeetCode: 17. Letter Combinations of a Phone Number

    描述:

    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.
    给定一个数字字符串,返回数字可能代表的所有可能的字母组合。
    数字到字母的映射(就像电话按钮一样)在下面给出。
    
    Input:Digit string "23"
    Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
    

    分析:

     思路一(BFS):
    1)本题难点在于,存在多组字符串的拼接。
    2)在已知输入字符串数量的前提下,采取将中间拼接字符串存储在vector暂存便于后面的字符串的拼接。
    3)拼接样例:
    输入“23”:
    (1)初始化一个string 的vector 初始值“”;
    (2)处理“2”:
        将2对应的“abc”的数组,将“”与“a”、“b”、“c”的字串拼接push_back进数组。删除首元素(中间暂存元素)“”。
    (3)处理“3”:
        将3对应的数组“def”,类似2操作:
        将“a”与“d”、“e”、“f”的字串拼接push_back进数组,删除首元素(中间暂存元素)“a”.
        将“b”与“d”、“e”、“f”的字串拼接push_back进数组,删除首元素(中间暂存元素)“b”.
        将“c”与“d”、“e”、“f”的字串拼接push_back进数组,删除首元素(中间暂存元素)“c”.
        "ad" "ae" "af" "bd" "be" "bf" "cd" "ce" "cf"
    

    代码:

    vector<string> letterCombinations(string digits) {
        vector<string > strNum = { "0", "1","abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
        vector <string> strRet;
        if (0 == digits.size())
        {
            return strRet;
        }
        strRet.push_back("");
        for (int i = 0; i < digits.size(); ++i)
        {
            int nSize = strRet.size();
            string strTmp = strNum[digits[i] - '0'];
            for (int j = 0; j < nSize; ++j)
            {
                for (int k = 0; k < strTmp.size(); ++k)
                {
                    strRet.push_back(strRet[0] + strTmp[k]);
                }
                strRet.erase(strRet.begin());
            }
        }
        return strRet;
    }
    
     思路二(DFS):
    1.利用DFS的思想进行枚举。
    2.基本思路为:
        2.1 判断字符串是否满足长度要求,满足则导入,否则继续遍历。
        2.2 通过传入的数字字符串的长度进行DFS深度的控制。
    

    代码:

    void DFSletterCombinations(vector<string>& vecRet, string digits, string strLetter, int nIndex)
    {
        vector<string > strNum = { "0", "1","abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
        if (nIndex == digits.size())
        {
            vecRet.push_back(strLetter);
        }
        else
        {
            string strTmp = strNum[digits[nIndex] - '0'];
            for (int i = 0; i < strTmp.size(); ++i)
            {
                string strComb = strLetter + strTmp[i];
                DFSletterCombinations(vecRet, digits, strComb, nIndex + 1);
            }
        }
    }
    
    vector<string> letterCombinations(string digits) {
        vector<string > strNum = { "0", "1","abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
        vector <string> vecRet;
        if (0 == digits.size())
        {
            return vecRet;
        }
        string strTemp = "";
        DFSletterCombinations(vecRet, digits, strTemp, 0);
       
        return vecRet;
    }
    

    备注:
    可以参考 cinderella_niu的博客LeetCode: 87 Letter Combinations of a Phone Number.

  • 相关阅读:
    C++ 引用做左值
    C++ 引用本质的详解
    C++ 引用基础
    C语言错误 指针的类型错误
    C++ c++与C语言的区别(三目运算符,const修饰符)
    C++ c++与C语言的区别(struct类型的加强,函数-变量类型加强,bool类型)
    C++ c++与C语言的区别(实用性增强,register关键字增强,全局变量检测增强)
    C++ c++初识
    C语言 Linux内核链表(企业级链表)
    C语言 结构体中属性的偏移量计算
  • 原文地址:https://www.cnblogs.com/liuwfuang96/p/7096078.html
Copyright © 2011-2022 走看看