题目:电话号码的字母组合
class Solution {
string arr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:
/* j
i 2 a b c
3 d e f
4 g h i
a
d e f
g h i g h i g h i
*/
void _letterCombinations(const string& digits, size_t i, string s, vector<string> &vs)
{
if(i >= digits.size())
{
vs.push_back(s);
return;
}
string str = arr[digits[i] - '0'];
for(size_t j = 0; j < str.size(); j++)
{
_letterCombinations(digits, i+1, s + str[j], vs);
}
}
vector<string> letterCombinations(string digits) {
string s;//
vector<string> vs;
if(digits == "")
{
return vs;
}
_letterCombinations(digits, 0, s, vs);
return vs;
}
};
难点:
-
递归的设计,类似于多叉树的遍历
如果是一个二叉树的话就不需要循环了
-
递归参数: 需要原来字符串;每次递归,会跳到下一个数字对应字符,所以需要i;需要存储一次字符组合的s;需要保存s的vs
-
步骤:
通过“23“ 获取 2 和 3,2 对应 abc,3对应edf
一个循环 条件: abc中获取a
s += a;
递归下去
edf获取e;s+=e;退出
edf获取d;s+=d;退出
edf获取f;s+=f;退出