#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;
}