老师,我根据7-4定义递归问题 BinaryTreePath 的递归思路实现Letter Combination,变慢了,不知道是我的实现问题还是算法本身确实比较慢?
我的思路: 比如digits="234", 在"34"返回的所有string前都加 “a”,“b”or “c”,再返回新的vector<string>。 如果是最后一个digits,则返回最后一个digit对应的几个字母。按照这个思路,可以减少了重复访问 “3”和“4”的次数,我觉得是更快的。
以下是我的code,在leetcode通过,3ms(课程实现代码0ms,怎么这么快,超越不了了=_=)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | 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; } }; |