leetcode:电话号码的字母组合(详解)

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

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

leetcode:电话号码的字母组合(详解)_第1张图片

示例 1:

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

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

思路:

 以digits ="23"为例

递归实现

leetcode:电话号码的字母组合(详解)_第2张图片

  一个string对象存储前几层递归下来的字符串

    如现在是第1层,前几层递归下来的字符串是"a"

一直递归,递归到某一层就带上这一层未被带走过的字符,加入到string对象中

如果递归到层号==digits.size()的,就返回,因为这一层已经没有字符可以加入了

代码实现:

class Solution 
{
    vector vv {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:

    void letter(const string& digits,  vector & v,int i,string combin)
    {
        if(i==digits.size())
        {
            v.push_back(combin);//一个组合已经有了
            return ;
        }

        string s = vv[digits[i]-'0'];//第i层所有的字符,即第i层的字符串
        for(auto e:s)//循环出第i层的所有字符
        {
            letter(digits,v,i+1,combin+e);//将第i层的某个字符加入到正在组合中的string对象中,并递归进入下一层
        }
    }

    vector letterCombinations(string digits)
    {
        vector v;
         if(digits.empty())
        {
            return v;
        }
        int i = 0;//表示第i层
        string combin;//存储第i层之前递归下来的字符串
        letter( digits,v,i,combin);
        return v;
    }
};

你可能感兴趣的:(leetcode,leetcode)