方法一(DFS)
实现思路
提前存储按钮对应的字母信息
利用递归的方法,在每一层依次遍历按钮对应的所有字母
递归出口:当组合的字符串长度等于按号长度时,将组成的字符串压入结果数组中
代码实现中:
不同按钮对应的字母个数是不同的,所以将按钮的字母数据统计存储到了vector中,便于在递归的过程中可以统一使用.size()获取字母的种类个数
实现代码
class Solution {
public:
void generate(int i,string s,string digits,vector<vector<char>> alp,vector<string> &re){
if(i>=digits.length()){
re.push_back(s);
return;
}
for(int j=0;j<alp[digits[i]-'0'].size();j++){
generate(i+1,s+alp[digits[i]-'0'][j],digits,alp,re);
}
}
vector<string> letterCombinations(string digits) {
vector<vector<char>> alp(2);
char a2[]={
'a','b','c'};
char a3[]={
'd','e','f'};
char a4[]={
'g','h','i'};
char a5[]={
'j','k','l'};
char a6[]={
'm','n','o'};
char a7[]={
'p','q','r','s'};
char a8[]={
't','u','v'};
char a9[]={
'w','x','y','z'};
vector<string> re;
if (digits.length()==0) return re;
alp.push_back(vector<char>(a2,a2+3));
alp.push_back(vector<char>(a3,a3+3));
alp.push_back(vector<char>(a4,a4+3));
alp.push_back(vector<char>(a5,a5+3));
alp.push_back(vector<char>(a6,a6+3));
alp.push_back(vector<char>(a7,a7+4));
alp.push_back(vector<char>(a8,a8+3));
alp.push_back(vector<char>(a9,a9+4));
generate(0,"",digits,alp,re);
return re;
}
};
注意使用vector初始化的方式vector a={1,2};
提交结果
时间复杂度O(4^n)
空间复杂度O(4^n+n)
方法二
实现思路
利用BFS的解法,一个vector< string >用来存放结果,另一个vector< string >是临时数组,两个数组进行循环使用,可从前一个数组中取出全部的字符串加上新的字符放到后一个数组中,下一次就从后一个数组中取出全部的字符串加上新的字符
实现代码
时间复杂度O(4^n)
空间复杂度O(2*4^n)