这道题题意是很简单,但是真要写的话,像我这样的小白还是觉得无从下手。想了很久,决定先用迭代的方式完成
string let[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> ans;
void recursion(string digits, string letter)
{
if(digits.size() == 0){ans.push_back(letter); return ;}
for (int i = 0; i < let[digits[0] - '0'].size() ; ++i)
{
recursion(digits.substr(1), letter + let[digits[0] - '0'][i]);
}
}
class Solution {
public:
vector<string> letterCombinations(string digits) {
if(digits == "")return ans;
string s = "";
ans.clear();
recursion(digits, s);
return ans;
}
};
那个ans.clear()其实是不需要的,但是在leetcode提交的时候总是会出错,必须先清零,不知道为什么。。。迭代写起来是比较简洁,但是执行效果差强人意,要花3ms,后来我又写出了循环的版本,理论上这样更快,但是我的写法比较挫,还是要3ms。。。。下面贴出0ms的完美版本~
class Solution {
public:
vector<string> letterCombinations(string digits) {
string key[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> ans;
if(digits == "")return ans;
ans.push_back("");
for (int i = 0; i < digits.size(); ++i)
{
int index = digits[i] - '0';
vector<string> temp;
for(int j = 0; j < ans.size(); j++){
for(int k = 0; k < key[index].size(); k++){
temp.push_back(ans[j] + key[index][k]);
}
}
ans = temp;
}
return ans;
}
};