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"].
分析:假设数字序列“234”,可以拆分成“23”+"4",假设序列“23”的输出结果已知(A),则“234”的输出结果:A + 'g',A+'h',A+'i'(A中每个字符串尾加上相应字符)。
string cmap[10] = {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> ret;
int i;
if(digits.size() == 0)
ret.push_back("");
else if(digits.size() == 1){
string tmp = cmap[digits[0] - '0'];
for(i = 0; i < tmp.size(); i++){
string s(1, tmp[i]);
ret.push_back(s);
}
}else{
vector<string> oldRet = letterCombinations(digits.substr(0, digits.size() - 1));
string last = cmap[digits[digits.size() - 1] - '0']; //最后一个数对应字符
vector<string> tmpRet(oldRet);
for(i = 0; i < last.size(); i++){
tmpRet = insertLetter(oldRet, last[i]);
ret.insert(ret.end(), tmpRet.begin(), tmpRet.end());
}
}
return ret;
}
vector<string> insertLetter(vector<string> svec, char c){
for(vector<string>::size_type ix = 0; ix < svec.size(); ix++)
svec[ix].append(1, c);
return svec;
}
};