目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
给我们按下的按键,让我们返回对应按键可能产生的所有可能。
这是一道很经典的递归题,我们首先先拿一个数组把每个按键可能按出的字母先存着。
接着我们开始递归,首先我们先确定,递归的参数是什么。
递归,那我们肯定是需要知道人家按下的按键是什么,所以要把按下的按键传给递归函数,其次我需要知道我递归到第几轮了,那这个是依据什么呢,依据就是我这次遍历轮到我按下的按键中的具体哪一个按键了,所以还需要一个下标指针,用来表示我们现在递归到哪一个按键了。此外我最终要的是排列组合,不能光递归不排列对吧,所以还需要传一个字符串表示我们之前按下的按钮已经凑成的临时排列组合。
参数讲完我们需要确定递归终止的条件,递归的条件没确定好是会造成死循环的。
我们一共按下多少按钮生成的所有排列组合是不是长度都是按下的按钮数,所以当我们表示下标的那个参数等于按钮数了,那是不是就等于是说我把按钮都按过了,那么就是下标大于等于按钮数组的长度了或者是临时排列组合的长度等于按钮数了,那么这个时候我就终止递归。
每次递归的时候,我们都去寻找当前按钮可能生成的字母,然后给临时排列组合那个变量加上进入下一轮递归。
递归完毕之后,我们就能得出所有按钮能产生的排列组合了。
具体可以看一下代码。
代码:
class Solution {
public:
vector<string> res;
vector<string> anjian{"","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void digui(string temp,string digits,int index){
if(index==digits.size()){ //长度一致时,收割答案
res.push_back(temp);
return;
}
string num(1,digits[index]);
int n=stoi(num)-1; //获取对应索引
for(char c:anjian[n]){ //开始递归
digui(temp+c,digits,index+1); //给临时字符串加上对应的字符进入下一轮递归
}
}
vector<string> letterCombinations(string digits) {
if(digits.size()==0) return res; //如果长度为零,那么直接返回空数组
digui("",digits,0);
return res;
}
};