A mapping of digit to letters (just like on the telephone buttons) is given below.
Input:Digit string "23" Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
这个题目是典型的DFS题,是属于combination的题目。
对于DFS的题目,首先想象出DFS树,这颗DFS树有几层,每一层有几个叉,DFS的层数对应了DFS这种recursion递归
的次数,而每一层有几个叉对应了DFS在每一层中要有多少次遍历,for循环要iterate的次数。
这个题目显然DFS树有digits.size()层,每一层有phone对应的digit的字母数。
对于手机上的字母和数字的对应关系,可以直接用string数组来表示,数组的Index就代表map中的key。
还有一点要注意的地方是digit中的元素是char,但是phone数组的index是int, 要获取phone里面的字母要
先把char 转化成int。
class Solution {
private:
void DFS(string digits, int level, string solu, vector<string> &rst, string phone[]) {
//base case
if (level == digits.size()) {
rst.push_back(solu);
return;
}
for (int i = 0; i < phone[digits[level]-'0'-1].size(); i++) {
solu += phone[digits[level]-'0'-1][i];
DFS(digits, level+1, solu, rst, phone);
solu.resize(solu.size()-1);
}
}
public:
//DFS solution
vector<string> letterCombinations(string digits) {
vector<string> rst;
string phone[] = {"", "abc", "def","ghi","jkl","mno","pqrs","tuv","wxyz"};
//sanity check
if (digits.size() == 0) return rst;
string solu = "";
DFS(digits, 0, solu, rst, phone);
return rst;
}
};
time complexity: O(n^k)
space complexity: O(n)
No comments:
Post a Comment