题目来源:. - 力扣(LeetCode)
题目思路分析
题目要求我们将一个数字字符串(每个数字对应一组字母,如2对应abc,3对应def等)转换成所有可能的字母组合。这是一个典型的组合生成问题,可以使用回溯算法来解决。回溯算法通过递归地构建候选解并逐步扩展,如果某个候选解不符合要求,则“回溯”并尝试其他可能的候选解。
- 初始化映射:首先,我们需要建立一个数字到字母的映射表。
- 递归生成组合:对于输入的数字字符串,我们从第一个数字开始,依次取出其对应的字母,然后递归地处理下一个数字。
- 回溯:在递归的过程中,当处理完一个数字的所有字母后,我们需要将最后一个添加的字母从当前组合中移除(即回溯),以便尝试下一个字母。
- 终止条件:当处理完所有数字时,我们将当前组合添加到结果集中。
代码:
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;
class Solution {
public:
// 回溯函数
void Backtracking(vector<string>& ans, string digits, string& pos, int index, unordered_map<char, string> PhoneMap) {
// 如果输入的数字字符串为空,直接返回
if (digits.empty()) {
return;
}
// 当处理完所有数字时,将当前组合添加到结果集中
if (index == digits.length()) {
ans.push_back(pos);
return;
} else {
// 取出当前数字对应的字母串
char digit = digits[index++];
string letter = PhoneMap.at(digit);
// 遍历当前数字的所有字母
for (char e : letter) {
pos += e; // 添加字母到当前组合
Backtracking(ans, digits, pos, index, PhoneMap); // 递归处理下一个数字
pos.erase(pos.length() - 1); // 回溯,移除最后一个字母
}
}
}
// 主函数,调用回溯函数生成所有可能的字母组合
vector<string> letterCombinations(string digits) {
// 建立数字到字母的映射表
unordered_map<char, string> PhoneMap {
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
vector<string> ans; // 存储所有可能的字母组合
string pos; // 当前构建的字母组合
Backtracking(ans, digits, pos, 0, PhoneMap); // 从第一个数字开始回溯
return ans;
}
};
注释详解
- 类定义:
Solution
类包含了回溯函数Backtracking
和主函数letterCombinations
。 - 回溯函数:
- 参数:
ans
(存储结果的向量),digits
(输入的数字字符串),pos
(当前构建的字母组合),index
(当前处理的数字索引),PhoneMap
(数字到字母的映射表)。 - 终止条件:如果
digits
为空或index
等于digits
的长度,则结束递归。 - 递归逻辑:取出当前数字对应的字母串,遍历每个字母,添加到
pos
中,然后递归处理下一个数字。递归返回后,需要移除最后一个添加的字母以尝试其他组合。
- 参数:
- 主函数:
- 初始化映射表
PhoneMap
。 - 调用回溯函数
Backtracking
开始生成组合。 - 返回结果集
ans
。
- 初始化映射表
知识点摘要
- 回溯算法:通过递归和状态重置(回溯)来生成所有可能的解。
- 递归:函数调用自身以解决问题的一部分。
- 映射表:使用
unordered_map
实现数字到字母的映射。 - 字符串操作:包括字符串的拼接和字符的移除。
通过这道题目,我们学习了如何使用回溯算法来解决组合生成问题。回溯算法是一种强大的工具,适用于解决许多涉及排列、组合和子集生成的问题。通过递归地构建候选解并逐步扩展,我们能够生成所有可能的解,并在必要时通过回溯来尝试其他解。此外,我们还学习了如何使用映射表来建立数字到字母的对应关系,以及如何进行字符串操作来构建和修改当前的组合。希望这篇文章能帮助你更好地理解和应用回溯算法。