Letter Combinations of a Phone Number
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.tag: backtracking, string
虽然tag里有回溯,但我却没想出回溯的算法。直接深搜,postorder traversal。然后在字符串的首部添加该层的字符,再把结果返回上一层。
在字符串拼接中‘+’运算符很好用。它可以连接字符与字符串,或者字符串与字符串。(concatenates two strings or a string and a char)
这里建议把键盘上的数字与字符的对应关系存在类的成员变量中,方便各个函数的调用,不用写长长的switch或if语句,代码会更简洁。
class Solution { public: vector<string> data; vector<string> letterCombinations(string digits){ data.push_back("");//0 data.push_back("");//1 data.push_back("abc");//2 data.push_back("def");//3 data.push_back("ghi");//4 data.push_back("jkl");//5 data.push_back("mno");//6 data.push_back("pqrs");//7 data.push_back("tuv");//8 data.push_back("wxyz");//9 return _letterCombinations(digits); } vector<string> _letterCombinations(string digits) { if (digits.size() == 0){ vector<string> re; re.push_back(""); return re; } if (digits.size() == 1){ vector<string> re; char c = digits[0]; for(int i = 0; i < data[c - '0'].size(); i++){ string s; s.push_back(data[c - '0'][i]); re.push_back(s); } return re; } else{//size > 1 vector<string> re; vector<string> lastRe = _letterCombinations(digits.substr(1)); char c = digits[0]; for(int i = 0; i < data[c - '0'].size(); i++){ for(int j = 0; j < lastRe.size(); j++){ re.push_back(data[c - '0'][i] + lastRe[j]); } } return re; } } };