17. 电话号码的字母组合
难度中等1347收藏分享切换为英文接收动态反馈
给定一个仅包含数字 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']
的一个数字。
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
class Solution {
public:
map<char,string> mp = {{'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"}, {'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}};
vector<string> res;
string cur;
vector<string> letterCombinations(string digits) {
if (digits.size() <= 0)
{
return res;
}
dfs(digits);
return res;
}
void dfs(string digits)
{
if (!digits.size())
{
res.push_back(cur);
return;
}
else
{
string letter = mp[digits[0]];
for (int i = 0;i < letter.size();++i)
{
cur.push_back(letter[i]);
dfs(digits.substr(1));
cur.pop_back();
}
}
}
};
int main()
{
Solution slu;
string digits("23456");
vector<string> ret = slu.letterCombinations(digits);
cout<<"ret.size: "<<ret.size()<<endl;
for (auto str:ret)
{
cout<<"str: " << str << endl;
}
return 0;
}
2. 解题思路
首先要明确题目要求的组合是什么形式的?
-
题目给出数字字符串digits,然后要求我们按照digits中每个字符对应的数字在键盘中对应的字符符来互相组合,组合出长度为strlen(digits)的字符串,这个字符串每个字母都唯一来自该数字所在的键位中的某个字符。
-
既然是组合问题,那么很大可能就是DFS,那如何得到呢?既然返回结果中的每一个string中的每一个字母都唯一来自不同键位,那么我们就当买菜,分别从各键位只挑一个来组合即可。