题目
经典的backtracking(回溯算法)的题目。当一个题目,存在各种满足条件的组合,并且需要把它们全部列出来时,就可以考虑backtracking了。当然,backtracking在一定程度上属于穷举,所以当数据特别大的时候,不合适。而对于那些题目,可能就需要通过动态规划来完成。
思路
假设输入的是”23”,2对应的是”abc”,3对应的是”edf”,那么我们在递归时,先确定2对应的其中一个字母(假设是a),然后进入下一层,穷举3对应的所有字母,并组合起来(”ae”,”ad”,”af”),当”edf”穷举完后,返回上一层,更新字母b,再重新进入下一层。这个就是backtracing的基本思想。
代码
class Solution {
public:
vector<string> letterCombinations(string digits) {
string table[] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
vector<string> result;
letterCombinations1(result, digits, "", 0, table);
return result;
}
void letterCombinations1(vector<string> &result, string &digits, string curr, int index, string table[]) {
if(index == digits.size()) {
if(curr.size() != 0)
result.push_back(curr);
return;
}
string temp = table[digits[index] - '0'];
for(int i = 0; i < temp.size(); i++) {
letterCombinations1(result, digits, curr + temp[i], index + 1, table);
}
}
};