老师,我根据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; } };