电话号码的字母组合
- 题目
- 代码
- 思路及代码讲解
- 代码(有注释版)
题目
电话号码的字母组合
代码
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;};};
思路及代码讲解
-
定义一个函数letterCombinations,用于生成给定数字字符串的所有可能的字母组合。
-
在类中定义一个私有成员变量numsStrArr,它是一个包含了数字0到9的字符串数组,每个数字对应一组可能的字母。例如,numsStrArr[2]对应的是"abc",numsStrArr[3]对应的是"def",以此类推。
-
接下来是函数Combine,它是一个递归函数,用于生成数字字符串的所有可能的字母组合。参数digits是输入的数字字符串,参数i表示当前处理的数字索引,参数CombineStr表示已经组合好的字母字符串,参数ret是存储结果的向量。
-
函数首先检查递归结束的条件,即当i等于digits的长度时,将已经组合好的字符串CombineStr加入到结果向量ret中,并返回。
-
接着,函数根据当前数字索引i从digits中获取数字,并在numsStrArr中找到对应的字母字符串str。
-
然后,函数使用一个循环遍历str中的每个字母,并调用自身递归地处理下一个数字索引i+1,并将当前字母添加到已经组合好的字符串CombineStr后面。
-
最后,在主函数letterCombinations中,首先创建一个空的结果向量ret。
-
然后,检查输入的数字字符串digits是否为空,如果为空,则直接返回空的结果向量。
-
接下来,创建一个空字符串str,并调用Combine函数开始递归生成所有可能的字母组合。
-
最后,将结果向量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; // 返回结果向量};
};
(本题完)