Leetcode-17. Letter Combinations of a Phone Number

题目

经典的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);
        }
    }
};

你可能感兴趣的:(数据结构及算法)