17. 电话号码的字母组合
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
题目链接
. - 力扣(LeetCode)
文字 和 画图 分析
这道题明显是需要互相匹配,如 字符串 “23”, 对应 “abc” 和 “def”。
这个时候我们就想到跟循环有关,但是我们很难控制出 for循环的个数 ,所以最好的办法就是采用递归
参数我们需要:digits (含 2-9 的字符串),di(表示层数) ,
tmp (每一层对应的字符串),t (接收每一次递归结束时的字符串)
注意事项:
- tmp 不要传引用 ,便于递归结束时可以对应到上一层的字符串
- t 需要传引用 ,我们需要每一次递归结束都保留相应的字符串
- 递归尽量参数不要使用 +=,否则递归结束,回到上一层,参数存储的值不会变
举例(digits = "23"):
递归顺序:
代码
class Solution { private: string letter[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; public: void _letterCombinations(string& digits,string tmp,int di,vector<string>& t) { if(di == digits.size()) { t.push_back(tmp); return; } int n = digits[di] - '0'; string s = letter[n]; for(auto i : s) { _letterCombinations(digits,tmp + i,di + 1,t); } } vector<string> letterCombinations(string digits) { vector<string> t; if(digits.size() == 0) { return t; } _letterCombinations(digits,"",0, t); return t; } };