【LeetCode】17. 电话号码的字母组合

17. 电话号码的字母组合(中等)

【LeetCode】17. 电话号码的字母组合_第1张图片
【LeetCode】17. 电话号码的字母组合_第2张图片
在这里插入图片描述

思路

  • 这是一道典型的回溯搜索。回溯题考虑三个点:参数&返回值(通常为void);终止条件(什么时候可以对结果进行搜索);单层递归。
  • 首先使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作。
  • 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。该字符串初始为空。显然递归的终止条件是:该字符串的长度和数字串长度相等,说明已经找到了一个排列,那么将它存入答案数组。
  • 每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。
  • 注意,这里是从两个集合分别选择一个字母,因此回退过程是针对某一数字所对应的字母集合,而不是针对选择的数字。

【LeetCode】17. 电话号码的字母组合_第3张图片

代码

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        // 哈希表
        unordered_map<char, string> match{{'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}};
        vector<string> ans;
        if(digits.size() == 0) return ans;
        string temp; // 存储每一种可能的结果
        backtracking(digits, ans, temp, 0, match);
        return ans;
    }
    void backtracking(string &digits, vector<string> &ans, string temp, int pos, unordered_map<char, string> &match){
        // pos表示当前搜索数字的下标
        if(temp.size() == digits.size()){
            ans.push_back(temp);
            return ;
        }
        // 不需要对digits[pos]进行for循环
        // 因为回溯的时候会自动搜索下一个数字
        for(int j=0; j<match[digits[pos]].size(); ++j){
            temp.push_back(match[digits[pos]][j]);
            backtracking(digits, ans, temp, pos+1, match);
            temp.pop_back();
        }
    }
};

你可能感兴趣的:(LeetCode刷题,leetcode,算法,职场和发展)