链接:电话号码的字母组合
描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
输入:digits = “”
输出:[]
输入:digits = “2”
输出:[“a”,“b”,“c”]
思路:这是一道很典型的组合问题,首先想到的就是递归和占的使用。
代码:
class Solution{
public:
string tmp;
vector<string> res;
vector<string> board={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void DFS(int pos, string digits){
if(pos == digits.size()) //停止条件为下一个递归结束的字符串长度大于应有的
{
res.push_back(tmp); //将tmp的值放入res字符串数组中
return ; //返回到上一次的条件中
}
int num = digits[pos] - '0'; //作为索引,查找board中对应num的字符串
for(int i = 0; i < board[num].size() ; i++) //遍历board第num位应放在pos上的字符们
{
tmp.push_back(board[num][i]); //对应字符插在tmp后面
DFS(pos+1, digits);
tmp.pop_back(); // 弹出一个 已组合好的字符串
}
}
vector<string> letterCombinations(string digits)
{
if(digits.size() == 0) return res; //空字符串直接返回
DFS(0, digits); //否则开始递归
return res;
}
};