LeetCode 17.电话号码的字母组合 回溯法 C/C++

这篇博客详细解析了一种使用回溯算法解决电话号码对应字母组合问题的方法。通过建立数字与字母的映射关系,递归地尝试所有可能的字母组合,最终生成所有可能的字母组合序列。博客中给出了具体的C++代码实现,展示了如何通过字符串操作和回溯技巧来生成所有可能的电话号码字母组合。
摘要由CSDN通过智能技术生成

题目连接
题解参考链接

主要思路:首先用一个字符串数组digitMap[10]存储数字和字母的映射关系;然后设置两个全局变量,一个为vector< string > ans作为最终的返回结果,另一个为string s,表示已有的字母排列(回溯过程中始终维护这个字符串);该字符串s初始为空,每次取电话号码的一位数字,从digitMap中获得该数字对应的字符串,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。
举例:文字描述繁琐的话,最好是模拟一下就清晰了,例如digits序列为“23”,首先字符串s为空,索引index = 0,指向digits序列的第一个位置即2,然后取出2对应的字符串为abc,然后将a插入s,此时s =“a”,之后回溯,索引index+1,指向digits序列的第二个位置,即3,而3所对应的字符串为def,同样的道理,遍历该字符串def,先将d插入到s中,此时 s=“ad”,索引index+1 = 2,即此时的s为符合条件的一个完整的字母组合,将其放入最终结果ans中,然后返回,接下来运行回溯函数(backtrack())的下一句语句:s.pop_back(),即回退,把d删除,此时s=“a”,继续循环,下一个字母为e,在插入s中,s=“ae”…如此往复,最终达到最终结果。详见代码。

class Solution {
private:
	const string digitMap[10] = {
		"","","abc","def",
		"ghi","jkl","mno",
		"pqrs","tuv","wxyz"
	};
public:
	vector<string> ans;
	string s;
	void backtrack(const string& digits,int index) {
		if(index==digits.length()){
			ans.push_back(s);
			return ;
		}
		int num = digits[index]-'0';
		string letters = digitMap[num];
		for(int i = 0;i<letters.length();++i) {
			s.push_back(letters[i]);
			backtrack(digits,index+1);
			s.pop_back();

		}
	}
	vector<string> letterCombinations(string digits) {
		if(digits.length()==0)return ans;
		backtrack(digits,0);
		return ans;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值