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”].
类似手机键盘,2-9每个数字匹配了所对应的字母。通过输入一个字符串,输出数字所对应的字母集合。
回溯法(backtracking),根据输入用例,2对应的是"abc",3对应的是"edf",那么在递归时,先确定2对应的其中一个字母(假设是a),然后进入下一层,穷举3对应的所有字母,并组合起来(“ae”,“ad”,“af”),当该层穷举完后,返回上一层,a更新为字母b,再重新进入下一层。
vector<string> letterCombinations(string digits) {
vector<string> res;
vector<vector<char>> vec(10, vector<char>(0));
int index = 0;
for (char let = 'a'; let <= 'r'; let++)
{
vec[index / 3].push_back(let);
index++;
}
vec[index / 3 - 1].push_back('s');
for (char let = 't'; let <= 'y'; let++)
{
vec[index / 3].push_back(let);
index++;
}
vec[index / 3 - 1].push_back('z');
string str = "";
perm(vec, str, digits, 0, res);
return res;
}
void perm(vector<vector<char>> &vec, string curr, string input_str,int level,vector<string> &res)
{
if (level == input_str.size())
{
res.push_back(curr);
return;
}
vector<char> tmp = vec[input_str[level] - '0' - 2];
for (int i = 0; i < tmp.size(); i++)
{
char c = tmp[i];
curr.push_back(c);
perm(vec, curr, input_str, level + 1, res);
curr.pop_back();
}
}