电话号码的字母组合 C++ 回溯递归

目录

题目描述

超时代码+分析:四层for循环

AC代码+分析:回溯递归


题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:

输入:digits = ""
输出:[]
示例 3:

输入:digits = "2"
输出:["a","b","c"]

提示:

0 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。

超时代码+分析:四层for循环

一开始,按照传统思路,我给它来了一个四层循环,外两层循环变换字符串,内两层循环拼接字符串,然后本地可以出结果,leetcode上就运行超时。然后就只能用算法解决了。

class Solution {
public:
    vector<string> letterCombinations(string digits) {
	string code[8] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}, temp;
	vector<string>answer,topick;
	for(auto & it:digits)topick.push_back(code[it-'2']);
	for(int i=0;i<topick.size()-1;i++)
	for(int j=i+1;j<topick.size();j++)
	for(auto & it:topick[i])
	for(auto & itit:topick[j]){
		temp.clear();
		temp.insert(temp.end(),it);
		temp.insert(temp.end(),itit);
		answer.push_back(temp);
	}
	return answer;
    }
};

AC代码+分析:回溯递归

类似与树和图的结构;请看图片:

 如果不用算法,暴力解决的话,理论上有几个字符串,就需要几个循环嵌套。

所以我们可以用深度优先的回溯来解决这个问题,详情看代码注释。

class Solution {
	public:
		string code[8] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};//设置为类数据,方便调用,不需要传太多参数 
		vector<string>answer;
		string digit;//方便调用,不需要传参数 
		void backtrack(string temp,int depth) {
			if(depth==digit.size())answer.push_back(temp);//如果层数与数字的个数,即总字符串数相同,说明这一枝拼接完毕 
			else{
				string temptemp=code[digit[depth]-'2'];//提取数字对应的字符串 
				for(auto it:temptemp)backtrack(temp+it,depth+1);//对于每一个子节点,拼接下一层 
			}
		}
		vector<string> letterCombinations(string digits) {
			digit=digits;//拷贝一份digits 
			if(digit.size()==0)return {};//空输入返回空字符串 
			backtrack("",0);//调用 
			return answer;	
		}
};
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaolinYe(叶茂林)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值