给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
class Solution {
public:
vector<string> letterCombinations(string digits) {
int num[8] = {3,3,3,3,3,4,3,4};
char alpha[8][5] = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
vector<string> res;
int sz = digits.size();
//sz即时输入的按键数,也是输出的组合长度
if(sz == 0)
return res;
int* multi = new int[sz];
//存按键
char* cur = new char[sz + 1];
//
cur[sz] = 0;
int sum = 1;
//算出一共会输出多少组组合
for(int i = sz - 1; i >= 0; i--)
{
multi[i] = sum;
if(digits[i] == '7' || digits[i] == '9')
sum *= 4;
else
sum *= 3;
}
res.resize(sum);
for(int i = 0; i < sum; i++)
{
for(int j = 0; j < sz; j++)
cur[j] = alpha[digits[j] -'2'][i / multi[j] % num[digits[j] -'2']];
//
res[i] = move(cur);
}
delete []multi;
delete []cur;
return res;
}
};