题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
已知数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
解题思路:
1.若输入的字符串为空则直接返回。
if(index==digits.size())
{
strs.push_back(str);
return ;
}
2.若输入的字符串不为空,以“23”为例 即 string digits=“23”
1)创建输入字符映射出的字符串数组
string letterMap[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
2)用 index 找到字符 2 从而找到映射的字符串
string letters=letterMap[digits[index]-'0'];
3)取出 2映射的字符串的第一个字符,与index+1 找到的字符 3映射的字符串的每个字符用 “+” 进行组合
//i=0时 letters[0]是 2的第一个字符
for(size_t i=0;i<letters.size();i++)
//index+1作为参数,找到字 3 从而找到映射的字符串
combinStr(digits,index+1,str+letters[i],strs);
4)用递归子问题的思想,将 2映射的字符串的每个字符,与 3映射的字符串的每个字符用 “+” 进行组合
5)组合字符串放在vector < string> 中,返回vector 即可
代码实现
// 创建要映射的字符串数组
string letterMap[10]={" "," ","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
class Solution {
public:
void combinStr(const string&digits,size_t index,const string&str,vector <string>&strs)
{
if(index==digits.size())
{
strs.push_back(str);
return ;
}
string letters=letterMap[digits[index]-'0'];
for(size_t i=0;i<letters.size();i++)
{
combinStr(digits,index+1,str+letters[i],strs);
}
}
vector<string> letterCombinations(string digits) {
vector <string> strs;
if(digits.empty())
return strs;
size_t index=0;
string str;
//递归子问题组合字符串
combinStr(digits,index,str,strs);
return strs;
}
};