Letter Combinations of a Phone Number:
Given a string containing digits from 2-9 inclusive, 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. Note that 1 does not map to any letters.
Example:
Input: “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.
Solution:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
private:
const string lettermap[10] = {
" ", //0
"", //1
"abc", //2
"def", //3
"ghi", //4
"jkl", //5
"mno", //6
"pqrs", //7
"tuv", //8
"wxyz" //9
};
vector<string> res;
// s中保存了此时从digits[0...index-1]翻译得到的一个字母字符串
// 寻找和digits[index]匹配的字母,获得digits[0...index]翻译得到的解
void findCombination(const string &digits, int index, const string &s){
if ( index == digits.size()){
// 保存s
res.push_back(s);
return;
}
char c = digits[index];
assert( c >= '0' && c <= '9' && c != '1');
string letters = lettermap[c - '0'];
for ( int i = 0; i < letters.size(); i++)
findCombination( digits, index + 1, s + letters[i]);
return;
}
public:
vector<string> letterCombinations(string digits) {
res.clear();
if ( digits == "")
return res;
findCombination(digits, 0, "");
return res;
}
};
总结: 仔细分析可以把此问题归为树形问题,如图:
想到要用递归的思想。要好好体会代码!