leetcode 17.电话号码的组合

练习地址:力扣

       这题其实本质上是变相的dfs / bfs,这题我选择了用dfs来做,按照给出的数字顺序依次排成几层,需要注意的点是这题里面只要求组合,而不要要求组合内部的顺序,只要一个组合内部包含同样的几个数字就算一个答案,否则这题的难度会上升一个档次。因为题目要求一个组合最多能放进4个字符,所以我们可以定义不同层下保存的字符串a,b,c,d. 当递归处理到最后一层时则把前面的字符串加起来就是答案之一加入到vector<int>res 中.另外需要注意的小点是题目给出的数字是以字符串的形式给出的,所以我们要用哈希表保存映射出来的数字,再开一个vector<string>将数字映射成它代表的字符串. 

      本题的模板其实就是以dfs/bfs 为基础的全排列经典问题

 

c++代码实现:

class Solution {
public:
    vector<string> letterCombinations(string digits) {
	    vector<string>res; //定义答案
		unordered_map<char, int>hash; //将digits转化成数字的形式存储
		int sizes = digits.size()-1; //保存一共需要用到几层节点
		hash['2'] = 2; hash['3'] = 3; hash['4'] = 4; hash['5'] = 5; hash['6'] = 6; hash['7'] = 7; hash['8'] = 8; hash['9'] = 9;//映射
		string a, b, c,d;//定义每一层需要保存的答案
		 if(digits.empty()) return res; //判空,返回空
		vector<string>alph = { "0", "0", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };//数字作为下标所对应的字符串,如下标2(数字2)对应字符串abc
		dfs(0, sizes,alph, digits, a, b, c, d,hash, res);//深度优先遍历
		return res;
    }
    void dfs(int height,int sizes, vector<string>&alph, string &s, string &a, string &b, string &c,string&d,unordered_map<char, int>&hash, vector<string>&res)
{
	int idx = hash[s[height]]; //存储当前用到了哪个节点
	for (int i = 0; i < alph[idx].size(); i++) //对每一层的节点对应的字符串里的每一个字符进行循环
	{
		if (height == 0) a = alph[idx][i]; //来自第0层的字符赋值给a
		if (height == 0 && height == sizes) { string middlestring = a; res.push_back(a);} //如果一共就只有0层则把a加到答案里去
		if (height == 1) b = alph[idx][i];
		if (height == 1 && height == sizes) { string middlestring = a + b; res.push_back(middlestring); } //如果一共有1层就把0层和1层加到答案里去,以此类推下面
		if (height == 2) c = alph[idx][i];
		if (height == 2 && height == sizes) { string middlestring = a + b + c; res.push_back(middlestring); }
		if (height == 3) d = alph[idx][i];
		if (height == 3 && height == sizes) { string middlestring = a + b + c + d; res.push_back(middlestring);}
		if (height + 1 <=sizes ) dfs(height + 1,sizes, alph, s, a, b, c,d, hash, res);//判定高度加一后是否超过总层数,是的话本次递归结束返回,不是的话继续从当前节点向下递归
	}
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值