leetcode17 电话号码的字母组合

 

#include "stdafx.h"
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
using namespace std;

/*
解法一:通过队列的方法
1、建立map哈希表
2、新建队列,将首字符对应的码表逐步加入队列中
3、将队列中每一个值与后一个字符对应的码表结合
4、所得的队列即为所求的结果,再添加到vector中

执行用时 :4 ms, 在所有 cpp 提交中击败了77.44%的用户
内存消耗 :8.5 MB, 在所有 cpp 提交中击败了82.41%的用户

vector<string> letterCombinations(string digits) {
	map<char, string> numToStr = { { '2',"abc" },{ '3',"def" },{ '4',"ghi" },{ '5',"jkl" },{ '6',"mno" },{ '7',"pqrs" },{ '8',"tuv" },{ '9',"wxyz" } }; //!!!注意char '2' 而不是 2
	vector<string> result;
	queue<string> que;
	int size = digits.size();
	//添加首元素对应的字母到队列中
	string temp = numToStr[digits[0]];
	for (int i = 0; i < numToStr[digits[0]].size(); i++) {
		string str;
		str.push_back(numToStr[digits[0]][i]);
		que.push(str);
	}
	//对于其它字符串
	for (int i = 1; i < size; i++) {
		//对于队列中的每一项,都与后一个字符串所对应的码表的每一个值相加并逐步存入队列中
		int length = que.size();
		while (length--) {
			for (int j = 0; j < numToStr[digits[i]].size(); j++) {
				string s = que.front();
				s = s + numToStr[digits[i]][j];
				que.push(s);
			}
			que.pop();
		}
	}

	while (!que.empty()) {
		result.push_back(que.front());
		que.pop();
	}
	return result;

}
*/


/*
解法二:递归调用,类似于二叉树
判断是否达到长度要求,达到则输出字符串,不达到则继续添加下一字符对应的码表元素
执行用时 :4 ms, 在所有 cpp 提交中击败了77.44%的用户
内存消耗 :8.7 MB, 在所有 cpp 提交中击败了45.76%的用户
*/
map<char, string> numToStr;
vector<string> result;
void findCombination(string digits, int deep, string s) {
	//判断s的长度
	if (deep == digits.size()) {
		result.push_back(s);
		return;
	}
	else {
		for (int i = 0; i < numToStr[digits[deep]].size(); i++) {
			findCombination(digits, deep + 1, s + numToStr[digits[deep]][i]);
		}
	}
}
vector<string> letterCombinations(string digits) {
	numToStr = { { '2',"abc" },{ '3',"def" },{ '4',"ghi" },{ '5',"jkl" },{ '6',"mno" },{ '7',"pqrs" },{ '8',"tuv" },{ '9',"wxyz" } }; //!!!注意char '2' 而不是 2

	//注意添加下面这一步,否则当输入为[]时,会输出[""]
	if (digits.empty()) {
		return result;
	}
	findCombination(digits, 0, "");
	return result;
}


int main()
{
	string input = "23";
	vector<string> result;
	result = letterCombinations(input);
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值