题目描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
方法一:
class Solution {
public:
void dfs(string& digits, vector<string>& str, vector<string>& ans, string& states, int index, int n , int digitsindex)
{
if (states.size() == n)
{
ans.push_back(states);
return;
}
for (int i = 0; i < str[index].size(); i++)
{
states.push_back(str[index][i]);
dfs(digits, str, ans, states, digits[digitsindex+1]-'0', n , digitsindex+1);
states.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if (digits == "")
{
return {};
}
vector<string> str{ "" , "" , "abc" , "def" , "ghi" , "jkl" , "mno" , "pqrs" , "tuv" , "wxyz" };
vector<string> ans;
string states;
int n = digits.size(); //每个组合的大小,用来判断是否得到了一个组合
int digitsindex = 0; //表示字符串digits的元素下标
int index = digits[0]-'0'; //表示字符串中某个元素的大小,也是数组str的元素下标
dfs(digits, str, ans, states, index, n , digitsindex);
return ans;
}
};
经典的dfs回溯,算是复习一下。
值得一提的是,第一次通过时,执行时间太慢,然后发现原来是dfs函数中的参数states未加引用符号&,添加之后执行时间就能够击败100%了。