leetcode 17. Letter Combinations of a Phone Number 深度优先搜索

题目大意就是:手机上的九键建立了一个数字和字母的对应关系,一个数字可能对应多个字母。输入一串数字,每个数字用一个它对应的某个字母代替,这一串数字就转化成了一串字母,输出所有可能的字母。

这道题用DFS搜索就可以求解了。以输入“232”为例。

2对应a,b,c三个字母。3对应着d,e,f 这三个字母。

首先是第一层数字2,第一层为数字2对应的第一个字母a

接着到第二层数字3,第二层为数字3对应的第一个字母d

接着到第三层数字2,第三层为最后一层,2对应的字母分别与ad组合:ada,adb,adc。

返回到第二层,第二层改为数字3对应的第二个字母e

再到第三层,第三层为最后一层,2对应的字母分别与ae组合:aea,aeb,aec

以此类推

求解代码:

class Solution {
public:
	static map< char,string > letter_map;
	static map< char,string > init_lettermap();
	vector<string> ret;
    vector<string> letterCombinations(string digits) {
        ret.clear();
		if(digits=="") return ret;
		letterCombinations(digits,0,"");
		return ret;
    }
	void letterCombinations(const string &digits,int layer,string s);
};

void Solution::letterCombinations(const string &digits,int layer,string s){
	string v=letter_map.at(digits[layer]);//第layer层对应的vector<string>
	
	//cout<<"layer="<<layer<<" s="<<s<<endl;
	//cout<<"v="<<v<<endl;
	
	if( layer==(int)(digits.size()-1) ){
		//if(digits[layer]=='1') ret.push_back(s);
		for(int i=0;i<(int)v.size();++i){
			string tmp(1,v[i]);
			ret.push_back(s+tmp);
		}
	}else{
		//if(digits[layer]=='1') letterCombinations(digits,layer+1,s);
		for(int i=0;i<(int)v.size();++i){
			string tmp(1,v[i]);
			letterCombinations(digits,layer+1,s+tmp);
		}
	}
}

map< char,string> Solution::init_lettermap(){
	map<char,string> m;
	m['1']="*";
	m['2']="abc";
	m['3']="def";
	m['4']="ghi";
	m['5']="jkl";
	m['6']="mno";
	m['7']="pqrs";
	m['8']="tuv";
	m['9']="wxyz";
	return m;
}
map<char,string> Solution::letter_map=Solution::init_lettermap();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值