LeetCode题解——17. 电话号码的字母组合

题目相关

题目链接

LeetCode中国,https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/。

题目描述

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

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

题目分析

LeetCode 给出本题难度中等。一个回溯算法题目。

题意分析

就是根据提供的数据,分解出所有可能的字符串。

样例数据分析

如同样例,输入 23。我们知道 2 对应的字母有 abc,3 对应的字母有 def。这样,我们可以构造出如下图所示的树。

LeetCode题解——17. 电话号码的字母组合_第1张图片

因此 23 对应的可能是 3*3=9 种,即 ad,ae,af,bd,be,df,cd,ce,cf 这九种。

算法设计

1、构造数字和字符串的关系对应表。

2、遍历输入的数字字符串,依据关系对应表,进行搜索和回溯。

数字和字符串的关系对应表

我们可以用一个非常简单的数组来构造,如下所示:

    vector relation = {
        " ",     /*数字0*/
        "",      /*数字1*/
        "abc",   /*数字2*/
        "def",   /*数字3*/
        "ghi",   /*数字4*/
        "jkl",   /*数字5*/
        "mno",   /*数字6*/
        "pqrs",  /*数字7*/
        "tuv",   /*数字8*/
        "wxyz"   /*数字9*/};//数字和字母关系

每次搜索的时候,进行查表即可。

搜索函数设计

老样子,先写搜索函数的模板。然后根据题目思考需要几个输入参数。

1、当前构造出来的字母字符串,名字为 path。

2、用户输入的数字字符串,名字为 digits。

3、已经搜索到第几位,名字为 idx。

因此,我们可以写出这个搜索函数的原型如下:

void dfs(string path, string digits, int idx)

搜索返回条件

就是 idx 和数字字符串 digits 的长度相等。

AC 参考代码

经过这样分析,我们就可以套用搜索回溯模板程序写出个大概。然后再调试一下即可。

class Solution {
public:
    vector ans;//答案
    vector relation = {
        " ", 
        "", 
        "abc", 
        "def", 
        "ghi", 
        "jkl", 
        "mno", 
        "pqrs", 
        "tuv", 
        "wxyz"};//数字和字母关系

    vector letterCombinations(string digits) {
        if (0==digits.length()) {
            //特例处理
            return vector();
        }
        string path;
        dfs(path, digits, 0);
        return ans;
    }

    void dfs(string path, string digits, int idx) {
        //返回条件
        if (idx==digits.length()) {
            ans.push_back(path);
            return;
        }

        //获取当前数字对应的字符串
        string str = relation[digits[idx]-'0'];
        for (int i=0; i

LeetCode题解——17. 电话号码的字母组合_第2张图片

你可能感兴趣的:(OJ题解,#,LeetCode题解,#,回溯算法,LeetCode题解,回溯算法,17,电话号码的字母组合)