Given a digit string, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below.
Input:Digit string "23" Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
题意&解题思路:
按照所给电话号码的顺序输出所有可能的字母组合。先构造一个数字对应字母的字符数组a,
char a[10][4] = {
{}, {}, {'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'},
{'j', 'k', 'l'}, {'m','n', 'o'}, {'p', 'q', 'r', 's'},
{'t', 'u', 'v'}, {'w', 'x', 'y', 'z'}
};
嗯,大致长酱紫吧,然后按照上面给的字母进行dfs,搜到最后一个就输出就好。需要注意的是,含有 0 和 1 字符的串在本题都是没有组合,返回空的vector。其他没啥值得注意的点。(不过输入含有其他字符如'a23'这种,判题系统也跟着出错,没有对这些非法输入进行判断)。代码如下:
class Solution {
public:
char a[10][4] = {
{}, {}, {'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'},
{'j', 'k', 'l'}, {'m','n', 'o'}, {'p', 'q', 'r', 's'},
{'t', 'u', 'v'}, {'w', 'x', 'y', 'z'}
};
void dfs(string str, vector<string>& ans, string s){
int len = 3, x = str[0] - '0';
if(x == 7 || x == 9)len++;
if(str.length() == 1){
for(int i = 0; i < len; i++)ans.push_back(s + a[x][i]);
return;
}
for(int i = 0; i < len; i++){
dfs(str.substr(1, str.length() - 1), ans, s + a[x][i]);
}
}
vector<string> letterCombinations(string digits) {
vector<string> ans;
int len = digits.length();
int ind = 0;
while(ind < len){
if(digits[ind] == '0' || digits[ind] == '1')return ans;
ind++;
}
if(digits.length() == 0)return ans;
string s = "";
dfs(digits, ans, s);
return ans;
}
};