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.
Subscribe to see which companies asked this question
分析:
比较典型的回溯法例子,和subset, combination等问题一样的backtracking。总是在指定的长度的digits中对应数字位置的字符串(在basestr字符串数组中的位置)进行递归,一旦找到答案就回溯!
本题联动:
<LeetCode OJ> 216. Combination Sum III
<LeetCode OJ> 77. Combinations
<LeetCode OJ> 78 / 90 Subsets (I / II)唯一的区别是要先建立一个从数字到字母的转换表。这样每一层递归遍历当前digits[i](是一个数字,表示在字母的转换表中的位置)所对应的字符串,并加入当前combination中传到下一层递归。
class Solution { public: void dfs(string &subans, string basestr[], int start)//使用引用,有利于防止内存大爆炸 { if (subans.size() == digit.size())//已经获得指定长度的答案,则回溯 { result.push_back(subans); return;//回溯 } for (int i = 0; i < basestr[digit[start]-'0'].size(); i++)//对指定字符数字位置的字符串进行回溯。 { subans.push_back(basestr[digit[start] - '0'][i]); dfs(subans, basestr, start + 1); subans.pop_back(); // 回溯完成后去掉末尾元素,准备下一轮回溯法找答案 } } vector<string> letterCombinations(string digits) { if(digits.empty()) return result; digit = digits; string basestr[10] = { "#", "#", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" }; string str; dfs(str, basestr, 0); return result; } private: vector<string> result; string digit; };
完整代码:
#include<iostream> #include<sstream> //istringstream 必须包含这个头文件 #include<string> #include "vector" using namespace std; class Solution { public: void dfs(string &subans, string basestr[], int start)//使用引用,有利于防止内存大爆炸 { if (subans.size() == digit.size())//已经获得答案,并且回溯 { result.push_back(subans); return;//回溯 } for (int i = 0; i < basestr[digit[start]-'0'].size(); i++) { subans.push_back(basestr[digit[start] - '0'][i]); dfs(subans, basestr, start + 1); subans.pop_back(); // 回溯完成后去掉末尾元素,准备下一轮回溯法找答案 } } vector<string> letterCombinations(string digits) { digit = digits; string basestr[10] = { "#", "#", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" }; string str; dfs(str, basestr, 0); return result; } private: vector<string> result; string digit; }; int main() { Solution s; string str("23"); vector<string> vec = s.letterCombinations(str); system("pause"); return 0; }
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/51287309
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895