个人技术分享

题目描述:

        给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

        

示例 1:

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

示例 2:

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

示例 3:

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

解题思路:

  • 创建一个指针数组numStrArr,存放每一个数字对应的字母序列,注意指针数组实际存放的是每一个序列首元素的地址。
  • 创建一个vector<string>对象v,用于返回所有可能的排列组合。
  • 创建一个string对象str,用来临时存放当前组合出的字符串。
  • 调用递归函数Combine,实现遍历每一个组合。

Combine递归函数解析:

  • 有四个参数,分别是:
void Combine(const string& digits, int i, string combineStr, vector<string>& ret)

        const string& digits:传过来要进行组合的数字的字符串。

        int i:遍历的深度,初始为0。也可以理解为数字字符串的下标。

        string combineStr:临时string对象,用来存放当前组合出的序列。

        vector<string>& ret:要返回的vector<string>对象。

  • 递归终止条件:
if (i == digits.size())
{
    ret.push_back(combineStr);
    return;
}

        如果遍历深度等于数字字符串的长度,说明遍历到最深的一层,先将当前的string对象添加到vector对象中,然后返回即可。

  • 获取当前深度的数字:
int num = digits[i] - '0';

        string对象中存储的是字符数字,要减去字符0才是整形数字。

  • 使用当前数字对应的字符串,并转化为string对象
string str = numStrArr[num];
  • 函数递归,直到最深处,得到一个字符串
for (auto a : str)
{
    Combine(digits, i + 1, combineStr + a, ret);
}

        

代码:

class Solution {
    const char* numStrArr[10] = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
public:
    void Combine(const string& digits, int i, string combineStr, vector<string>& ret)
    {
        if (i == digits.size())
        {
            ret.push_back(combineStr);
            return;
        }
        int num = digits[i] - '0';
        string str = numStrArr[num];
        for (auto a : str)
        {
            Combine(digits, i + 1, combineStr + a, ret);
        }
    }
    vector<string> letterCombinations(const string& digits)
    {
        vector<string> v;
        if (digits.empty())
        {
            return v;
        }
        string str;
        Combine(digits, 0, str, v);
        return v;
    }
};