题目描述(难度中)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
链接
https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
思路
1、回溯
2、类似于BFS,可递归可非递归。对于访问到的每一个字符,直接复制字符串,并在后面新加入对应需要的字母。
代码
可以写得更简洁一些,不过思路是这样子的
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> ans;
if(digits.length() == 0){
return ans;
}
ans.push_back("");
for(int i = 0; i < digits.length(); i++){
vector<string> ansTemp;
int times = 0;
if(digits[i] > '0' && digits[i] < '7' || digits[i] == '8'){
times = 3;
}
if(digits[i] == '7' || digits[i] == '9'){
times = 4;
}
for(int j = 0; j < ans.size(); j++){
for(int k = 0; k < times; k++){
ansTemp.push_back(ans[j]);
}
}
ans = ansTemp;
if(digits[i] == '2'){
for(int j = 0; j < ans.size(); j++){
ans[j] += 'a' + j%3;
}
}
if(digits[i] == '3'){
for(int j = 0; j < ans.size(); j++){
ans[j] += 'd' + j%3;
}
}
if(digits[i] == '4'){
for(int j = 0; j < ans.size(); j++){
ans[j] += 'g' + j%3;
}
}
if(digits[i] == '5'){
for(int j = 0; j < ans.size(); j++){
ans[j] += 'j' + j%3;
}
}
if(digits[i] == '6'){
for(int j = 0; j < ans.size(); j++){
ans[j] += 'm' + j%3;
}
}
if(digits[i] == '7'){
for(int j = 0; j < ans.size(); j++){
ans[j] += 'p' + j%4;
}
}
if(digits[i] == '8'){
for(int j = 0; j < ans.size(); j++){
ans[j] += 't' + j%3;
}
}
if(digits[i] == '9'){
for(int j = 0; j < ans.size(); j++){
ans[j] += 'w' + j%4;
}
}
}
return ans;
}
};