1、问题分析
题目链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
本质上就是一个深搜问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。
2、问题解决
笔者以C++
方式解决。
#include "iostream"
using namespace std;
#include "algorithm"
#include "vector"
#include "queue"
#include "set"
#include "map"
#include "string"
#include "stack"
class Solution {
private:
// 定义各个数值代表的字符串
vector<string> dataChen = {
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
// 结果数组
vector<string> result;
public:
vector<string> letterCombinations(string digits) {
// 如果给定的字符串是空,则返回空数组
if (digits.empty()) {
return result;
}
// 当前正在处理的字符串
string temp;
// 深搜,从 0 开始
dfs(digits, temp, 0);
return result;
}
/**
* 深搜所有的组合
* @param digits 字符串
* @param temp 当前正在处理的字符串
* @param index 当前处理的下标
*/
void dfs(string digits, string &temp, int index) {
// 越界直接返回
if (index > digits.length()) {
return;
}
// 达到符合要求的边界,保存值到结果数组,并返回
if (temp.length() == digits.length()) {
result.push_back(temp);
return;
}
// 获取字符串中 index 处的数字
int number_data = digits[index] - '0';
// 获取其代表的字符串的索引
number_data -= 2;
// 获取代表的字符串
string basicString = dataChen[number_data];
// 遍历整个代表的字符串,分为取和不取两种状态
for (int i = 0; i < basicString.length(); ++i) {
// 取该值
temp.push_back(basicString[i]);
// 进入下一次迭代,将正在处理的索引 + 1
dfs(digits, temp, index + 1);
// 不取该值
temp.pop_back();
}
}
};
int main() {
Solution *pSolution = new Solution;
auto vector1 = pSolution->letterCombinations("23");
for (int i = 0; i < vector1.size(); ++i) {
cout << vector1[i] << endl;
}
system("pause");
return 0;
}
运行结果
有点菜,有时间再优化一下。
3、总结
难得有时间刷一波LeetCode
, 这次做一个系统的记录,等以后复习的时候可以有章可循,同时也期待各位读者给出的建议。算法真的是一个照妖镜,原来感觉自己也还行吧,但是算法分分钟教你做人。前人栽树,后人乘凉。在学习算法的过程中,看了前辈的成果,受益匪浅。
感谢各位前辈的辛勤付出,让我们少走了很多的弯路!
哪怕只有一个人从我的博客受益,我也知足了。
点个赞再走呗!欢迎留言哦!