用DFS挨个搜索,把几个数字代表的字母存放到一个数组里,数组前两个为空让数组的值对应2~9。
DFS中传入两个参数:第一个每次递归传递的的字符串,第二个n表示当前从第几个数字里取值。
定义int m = int(dig[n] - 48);
("23"第一次递归m = 2,第二次m = 3,对应arr中的字符串)
根据题意结果中每个字符串字符个数与digits的长度相同,所以if (n == dig.size())
表示这一串搜索完成,将字符串添加到结果数组然后回溯。
class Solution {
public:
vector<string> arr = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> res;
string dig;
void dfs(string str, int n) {
int m = int(dig[n] - 48);
if (n == dig.size()) {
res.push_back(str);
return;
}
for (int i = 0; i < arr[m].size(); i++) {
dfs(str + arr[m][i], n + 1);
}
}
vector<string> letterCombinations(string digits) {
if (digits.size() == 0) return res;
dig = digits;
dfs("", 0);
return res;
}
};