Leetcode 17 电话号码的字母组合

题目背景:
Leetcode 17 电话号码的字母组合========================================================================================================
解法:回溯算法 代码随想录的解法
理解回溯的思想:
以输入’12’为例 “1-abc”,”2-def”,输出“ad ae af bd be bf cd ce cf”
首先进入回溯过程,找到第一个数字1对应的第一个字母a,当遍历到a时,开始找2对应的字母组合,一直递归找到组合ad ae af ;
后开始找第一个数字对应的字母b,开始找2对应的字母组合,一直递归找到bd be bf;
后开始找第一个数字对应的字母c,开始找2对应的字母组合,一直递归找到cd ce cf

class Solution
{
private:
	//封装1-10个按键上的字母
	const string letterMap[10]
	{
		"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"
	};
public:

	vector<string>res;//用于存储最终的字母组合
	string s;//用于暂存字母
	//回溯算法
	void backtracking(const string& digits, int index) //输入一个数字组合 例如;输入"12" 输出"ab"
	{
		//回溯终止
		if (index == digits.size())//index表示字母组合的字母个数,是不断增加的
			                                       //最后输出的字母组合的字母个数和输入数字组合的数字个数一样
		{
			res.push_back(s);
			return;
		}
		int digit = digits[index] - '0';//字符串转整数 找到数字组合中的第一个数字
		string letters = letterMap[digit];//找到数字键上对应的字母组合;
		                                            //一个数字对应的是一个字母组合
		//遍历每一个字母
		for (int i = 0; i < letters.size(); i++)
		{
			s.push_back(letters[i]);//将第一个数字对应的第一个字母
			backtracking(digits, index + 1);//开始找第二个数字对应的字母 找到两个字母的组合后开始返回
			s.pop_back();//
		}
	}
	vector<string>letterCombninations(string digits)//输入数字组合 
	{
		s.clear();
		res.clear();
		if (digits.size() == 0)
		{
			return res;
		}
		backtracking(digits, 0);//将字母组合的字母个数初始化为0
		return res;
	}
};

上一篇:力扣算法成长日记 ———— 01


下一篇:打卡大卡打卡打卡 .17-21