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.
一个数字代表3位或者4位字母,这道题就是输入一串数,然后输出所有的字母组合。
class Solution {
public:
vector<string> letterCombinations(string digits) {
if (digits.empty()) {
return vector<string>();
}
string letters[10] = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int num = atoi(digits.c_str());
int each[digits.size()];
int i = 0;
while(num){
each[i] = num % 10;
num /= 10;
i++;
}
deque<string> ans;
ans.push_back("");
for(int p = digits.size() - 1; p >= 0; p--){
for(int q = ans.size(); q > 0; q--){
string temp = ans.front();
ans.pop_front();
for(int x = 0; x < letters[each[p]].size(); x++)
ans.push_back(temp + letters[each[p]][x]);
}
}
return vector<string>(ans.begin(), ans.end());
}
};
这道题我的思路是:先用string数组储存26个字母,然后把digits转换成int类型,并且得到其每个数位的数。
申请一个双向队列ans,然后对每个数进行循环,在循环中再对双向队列进行循环,每次循环都把队列头部拿出来,然后弹出,把头部加上下一位的字母,压到队尾。这样可以把队列里面的每个string都更新一遍。
这道题不用双向队列也是可以的,就是最后转换成vector的时候麻烦一点。
hit:在申请队列的时候要先添加一个空数组,这样才有第二层循环。