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"].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
Personal tips: 根据下一个数字对应3或4个英文,将数组扩充到原来的3或4倍,分别加上英文。如“23”,原来2,申请vector<string>大小为3,遍历到‘3’时,数组大小扩大到3*3=9,每3个添加‘d' , 'e', 'f',代码实现如下:
class Solution {
public:
Solution()
{
numToAlpha.insert(pair<char, vector<char>>('2', { 'a','b','c' }));
numToAlpha.insert(pair<char, vector<char>>('3', { 'd','e','f' }));
numToAlpha.insert(pair<char, vector<char>>('4', { 'g','h','i' }));
numToAlpha.insert(pair<char, vector<char>>('5', { 'j','k','l' }));
numToAlpha.insert(pair<char, vector<char>>('6', { 'm','n','o' }));
numToAlpha.insert(pair<char, vector<char>>('7', { 'p','q','r','s' }));
numToAlpha.insert(pair<char, vector<char>>('8', { 't','u','v' }));
numToAlpha.insert(pair<char, vector<char>>('9', { 'w','x','y','z' }));
}
vector<string> letterCombinations(string digits) {
vector<string> combinations;
int i = 0;
if (digits.empty()) return combinations;
while (digits[i]!='\0')
{
if (digits[i] != '0' && digits[i] != '1') break;
++i;
}
if (digits[i] == '\0') return combinations;
vector<char>::iterator it = numToAlpha[digits[i]].begin();
while (it!= numToAlpha[digits[i]].end())
{
string a;
a.push_back(*it++);
combinations.push_back(a);
}
++i;
while (digits[i]!='\0')
{
if (digits[i] == '0' && digits[i] == '1') { ++i; continue; }
int count = numToAlpha[digits[i]].size() - 1, lastNum = combinations.size(), flag = (count > 2), l = lastNum;
while (count>0)
{
int start = 0;
while (start < lastNum) { combinations.push_back(combinations[start++]); }
--count;
}
while (l>0)
{
combinations[l - 1].push_back(numToAlpha[digits[i]][0]);
combinations[l + lastNum - 1].push_back(numToAlpha[digits[i]][1]);
combinations[l + 2 * lastNum - 1].push_back(numToAlpha[digits[i]][2]);
if (flag == 1) combinations[l + 3 * lastNum - 1].push_back(numToAlpha[digits[i]][3]);
--l;
}
++i;
}
return combinations;
}
private:
map<char, vector<char>> numToAlpha;
};