leetcode原题链接:电话号码的字母组合
上一篇:HOT56-子集
下一篇:HOT58-组合总和
题目描述
给定一个仅包含数字 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']
的一个数字。
解题方法: 回溯法。backtrack(digits, i, tmp, result, mp)表示依次对第i个数字对应的字母进行赋值处理。
C++代码
#include <iostream>
#include <string>
#include <vector>
#include <map>
class Solution {
public:
std::vector<std::string> letterCombinations(std::string digits) {
int n = digits.size();
if (n == 0) {
return {};
}
std::string tmp;
std::vector<std::string> result;
std::map<char, std::string> mp = {
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
backtrack(digits, 0, tmp, result, mp);
return result;
}
// 对第i个数字对应的字母分别取值
void backtrack(const std::string& digits,
int i,
std::string& tmp,
std::vector<std::string>& result,
std::map<char, std::string>& mp) {
int n = digits.size();
if (i == n) {
result.emplace_back(tmp);
return;
}
char number = digits[i];
if (mp.count(number)) { //对digits[i]的每一种可能做出选择
std::string str = mp[number];
for (char ch : str) {
tmp.push_back(ch);//做出选择
backtrack(digits, i + 1, tmp, result, mp);
tmp.pop_back();//撤销选择
}
}
}
};