1. 概述
1.1 题目
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"].如上面题目所说,题目给出一串由数字组成的字符串,输出所有可能的字符串的排列组合的可能。上面的‘*’、‘#’在实际的算法处理中不考虑。
1.2 解题思路
对于这道题是求解排列组合问题,首先对于输入不为空的情况下,会有按照第一个数字指代的字符串作为种子,然后后面数字指代的字符串进入进来生长。因而就需要3层的for循环。第一层for循环用于遍历数字字符串中的所有数字;第二层for循环用于遍历结果vector中的元素,将其用于第三个for循环中;第3层for循环中将为vector中的字符串添加一个字符。
2. 编码
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> value;
if("" == digits) return value;
//各个数字对应的字符模板
string temp[] = {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
int len(digits.length()); //字符串的长度
string str = temp[digits.at(0)-'0']; //取得字符模板
int len_temp(str.length());
for(int i=0; i<len_temp; ++i)
{
string m = "";
m += str.at(i);
value.push_back(m);
}
for(int i=1; i<len; ++i)
{
str = temp[digits.at(i)-'0']; //取得字符模板
len_temp = str.length();
int vec_size(value.size());
for(int j=0; j<vec_size; ++j)
{
for(int k=1; k<len_temp; ++k)
{
value.push_back(value[j] + str.at(k));
}
value[j] = value[j] + str.at(0);
}
}
return value;
}
};