题目:
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.
题目解答:
题目要求根据输入的数字串,判断出可能产生的字母序列。首先,需要存储每个数字与字母字符的映射关系,在这里,我们使用map结构来存储。之后,不断使用迭代实现对可能产生的字母序列的遍历过程。
代码:
class Solution { public: Solution() //建立映射关系 { vector<char> _0_; digitMapChars['0'] = _0_; vector<char> _1_; digitMapChars['1'] = _1_; vector<char> _2_; _2_.push_back('a'); _2_.push_back('b'); _2_.push_back('c'); digitMapChars['2'] = _2_; vector<char> _3_; _3_.push_back('d'); _3_.push_back('e'); _3_.push_back('f'); digitMapChars['3'] = _3_; vector<char> _4_; _4_.push_back('g'); _4_.push_back('h'); _4_.push_back('i'); digitMapChars['4'] = _4_; vector<char> _5_; _5_.push_back('j'); _5_.push_back('k'); _5_.push_back('l'); digitMapChars['5'] = _5_; vector<char> _6_; _6_.push_back('m'); _6_.push_back('n'); _6_.push_back('o'); digitMapChars['6'] = _6_; vector<char> _7_; _7_.push_back('p'); _7_.push_back('q'); _7_.push_back('r'); _7_.push_back('s'); digitMapChars['7'] = _7_; vector<char> _8_; _8_.push_back('t'); _8_.push_back('u'); _8_.push_back('v'); digitMapChars['8'] = _8_; vector<char> _9_; _9_.push_back('w'); _9_.push_back('x'); _9_.push_back('y'); _9_.push_back('z'); digitMapChars['9'] = _9_; } vector<string> letterCombinations(string digits) { vector<string> fres; //最终结果存储在fres中 if(digits == "") return fres; string::iterator sit = digits.begin(); //使用sit迭代器来完成对digits这个字符串的访问 list<string> res; //结果存储在res中 int former_size = 1; while(sit != digits.end()) { if(digitMapChars.find(*sit) == digitMapChars.end()) //出现未知字符 { break; } int tmp_size = digitMapChars[*sit].size(); if(res.empty()) { former_size *= digitMapChars[*sit].size(); for(vector<char>::iterator vit = digitMapChars[*sit].begin(); vit != digitMapChars[*sit].end(); vit++) { string t = ""; res.push_back(t + *vit); } } else { int former_num = former_size; former_size *= digitMapChars[*sit].size(); int cur_num = digitMapChars[*sit].size(); while(former_num != 0) { string strtmp = res.front(); for(int i = 0;i < cur_num;i++) { res.push_back(strtmp + digitMapChars[*sit][i]); } res.pop_front(); former_num--; } } sit++; //使用sit来实现对字符串中数字的遍历 } for(list<string>::iterator sit = res.begin(); sit != res.end(); sit++) { //cout << *sit << endl; fres.push_back(*sit); } return fres; } private: map<char,vector<char> > digitMapChars; };