老师,我根据7-4定义递归问题 BinaryTreePath 的递归思路实现Letter Combination,变慢了,不知道是我的实现问题还是算法本身确实比较慢?
我的思路: 比如digits="234", 在"34"返回的所有string前都加 “a”,“b”or “c”,再返回新的vector<string>。 如果是最后一个digits,则返回最后一个digit对应的几个字母。按照这个思路,可以减少了重复访问 “3”和“4”的次数,我觉得是更快的。
以下是我的code,在leetcode通过,3ms(课程实现代码0ms,怎么这么快,超越不了了=_=)
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> findCombination(string digits,int index){
vector<string> res;
//for last index, return s[digits[digits.size()-1]]
if(index==digits.size()-1) {
char c = digits[index];
assert(c>='0'&&c<='9'&&c!='1');
string letters = letterMap[c-'0'];
for(int i=0;i<letters.size();i++) {
string s1(1, letters[i]);
res.push_back(s1);
}
return res;
}
// add s[digits[index]] to s[digits[0...index-1]]
char c = digits[index];
assert(c>='0'&&c<='9'&&c!='1');
string letters = letterMap[c-'0'];
vector<string> s = findCombination(digits, index+1);
for(int i=0;i<letters.size();i++){
for(int j=0;j<s.size();j++){
string s1(1, letters[i]);
string newS = s1 + s[j];
cout<<"get "<<newS<<endl;
res.push_back(newS);
}
}
return res;
}
public:
vector<string> letterCombinations(string digits) {
vector<string> res;
if(digits=="")
return res;
res = findCombination(digits,0);
return res;
}
};