Problem description:
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"].
Analysis:
Ref : http://www.cnblogs.com/jcliBlogger/p/4582179.html
A typical backtracking problem. Make sure you are clear with the following three problems:
1. What is a partial solution and when is it finished ?
The partial solution is a combination and it is finished once it is of the same length as digits.
2. How to find all the partial solutions?
Using a nested for-loop to traverse all the possible starting elements for each digit.
3. When to make recursive calls?
Once an element is added to the partial solution, we call the function to generate the remaining elements recursively.
Codes:
class Solution{
public:
static string letter[] ;
vector<string> letterCombinations(string digits) {
int n = digits.size();
vector<string> res;
string s = "";
if (!n) return res;
helper(res, s, digits, 0);
return res;
}
void helper(vector<string>& res, string& s, string& digits, int start)
{
if (start == digits.size())
{
res.push_back(s);
return;
}
for (int i = 0; i < letter[digits[start] - '0'].size(); ++i)
{
s += letter[digits[start] - '0'][i];
helper(res, s, digits, start + 1);
s.pop_back();
}
}
};
string Solution :: letter[] = {" ", " ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};