电话号码的字母组合(C++实现)

简介: 电话号码的字母组合(C++实现)


题目


电话号码的字母组合


代码

class Solution {
    const char* numsStrArr[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 =numsStrArr[num];
        for(auto e:str)
        {
            Combine(digits,i+1,CombineStr+e,ret);
        }
    }
    vector<string> letterCombinations(string digits) {
        vector<string> ret;
        if(digits=="")
        {
            return ret;
        }
        string str;
        Combine(digits,0,str,ret);
        return ret;
    };
};

思路及代码讲解

  1. 定义一个函数letterCombinations,用于生成给定数字字符串的所有可能的字母组合。
  2. 在类中定义一个私有成员变量numsStrArr,它是一个包含了数字0到9的字符串数组,每个数字对应一组可能的字母。例如,numsStrArr[2]对应的是"abc",numsStrArr[3]对应的是"def",以此类推。
  3. 接下来是函数Combine,它是一个递归函数,用于生成数字字符串的所有可能的字母组合。参数digits是输入的数字字符串,参数i表示当前处理的数字索引,参数CombineStr表示已经组合好的字母字符串,参数ret是存储结果的向量。
  4. 函数首先检查递归结束的条件,即当i等于digits的长度时,将已经组合好的字符串CombineStr加入到结果向量ret中,并返回。
  5. 接着,函数根据当前数字索引i从digits中获取数字,并在numsStrArr中找到对应的字母字符串str。
  6. 然后,函数使用一个循环遍历str中的每个字母,并调用自身递归地处理下一个数字索引i+1,并将当前字母添加到已经组合好的字符串CombineStr后面。
  7. 最后,在主函数letterCombinations中,首先创建一个空的结果向量ret。
  8. 然后,检查输入的数字字符串digits是否为空,如果为空,则直接返回空的结果向量。
  9. 接下来,创建一个空字符串str,并调用Combine函数开始递归生成所有可能的字母组合。
  10. 最后,将结果向量ret返回作为函数的输出。

代码(有注释版)

class Solution {
    const char* numsStrArr[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 =numsStrArr[num];
        // 遍历当前数字对应的字母字符串中的每个字母
        for(auto e:str) {
            // 递归处理下一个数字索引,并将当前字母添加到已经组合好的字符串后面
            Combine(digits,i+1,CombineStr+e,ret);
        }
    }
    // 生成数字字符串的所有可能的字母组合
    vector<string> letterCombinations(string digits) {
        vector<string> ret;
        if(digits=="") {
            return ret; // 如果输入字符串为空,则直接返回空结果向量
        }
        string str;
        // 调用递归函数生成所有可能的字母组合
        Combine(digits, 0, str, ret);
        return ret; // 返回结果向量
    };
};

(本题完)

相关文章
|
4天前
|
C++
c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)
c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)
56 0
|
4天前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
4天前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
66 1
Linux 终端操作命令(1)
|
4天前
|
Java Go C++
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
36 0
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
|
4天前
|
Python C++ Java
C/C++每日一练(20230417) 字母异位词分组、右侧小于当前元素个数、加一
C/C++每日一练(20230417) 字母异位词分组、右侧小于当前元素个数、加一
27 0
C/C++每日一练(20230417) 字母异位词分组、右侧小于当前元素个数、加一
|
4天前
|
Python C++ Java
C/C++每日一练(20230407) 选择排序法、多数元素、字母异位词分组
C/C++每日一练(20230407) 选择排序法、多数元素、字母异位词分组
38 0
C/C++每日一练(20230407) 选择排序法、多数元素、字母异位词分组
|
4天前
|
C++
有效的字母异位词(C++)
有效的字母异位词(C++)
19 0
|
9月前
|
存储 算法 C++
【C/C++练习】经典的排列组合问题(回溯算法)——电话号码的字母组合
【C/C++练习】经典的排列组合问题(回溯算法)——电话号码的字母组合
81 0
【C++之标准类型数据的格式输出2】显示字母B组成的三角形
【C++之标准类型数据的格式输出2】显示字母B组成的三角形
|
4天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
18 0