题目描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:“23” 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
看到这题目那就是遍历啊!!!,知道的遍历有二叉树的前序、中序、后序遍历和图的DFS、BFS遍历。现在想想方法就出来了,就是图的遍历。。
而深度优先遍历是基于递归,广度优先遍历则基于队列实现
一、深度优先遍历(递归回溯)
假设输入223, DFS遍历顺序则是
第一步:红色线伞种情况
第二步:蓝色线三种情况
第三步:以此类推。。。
//DFS(回溯法)
#include <vector>
#include <string>
#include <iostream>
#include <unordered_map>
using namespace std;
class Solution
{
vector<string> result;
string digits;
unordered_map<char, string> store= { {'2',"abc"},{'3',"def"},{'4',"ghi"},
{'5',"jkl"},{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"} };
public:
vector<string> letterCombinations(string digits)
{
if (digits.size() == 0)
return result;
this->digits = digits;
//选择好初始状态
dfs("", 0);
return result;
}
void dfs(string resultStr, int index)
{
int digitsSize = this->digits.size();
//递归退出条件
//遍历到最后一个时,正好组成一个结果
if (digitsSize == index)
{
result.push_back(resultStr);
return;
}
char targetChar = this->digits[index];
string targetString = store[targetChar];
//DFS
for (auto tmp : targetString)
{
dfs(resultStr + tmp, index + 1);
}
return;
}
};
int main()
{
Solution ss;
vector<string> res = ss.letterCombinations("223");
for (int i = 0; i < res.size(); i++)
{
cout << res[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
BFS
假设输入223, BFS遍历顺序则是
#include <vector>
#include <string>
#include <queue>
#include <iostream>
#include <unordered_map>
using namespace std;
class Solution
{
vector<string> result;
string digits;
unordered_map<char, string> store = { {'2',"abc"},{'3',"def"},{'4',"ghi"},
{'5',"jkl"},{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"} };
public:
vector<string> letterCombinations(string digits)
{
if (digits.empty())
{
return result;
}
this->digits = digits;
queue<string> workQueue;
workQueue.push(" ");
for (auto targetChar : digits)
{
string targetStr = store[targetChar];
int queueSize = workQueue.size();
for (int i = 0; i < queueSize; i++)
{
string tmp = workQueue.front();
workQueue.pop();
for (auto tmpChar : targetStr)
{
workQueue.push(tmp + tmpChar);
}
}
}
while (!workQueue.empty())
{
string haha = workQueue.front();
workQueue.pop();
result.push_back(haha);
}
return result;
}
};
int main()
{
Solution s;
vector<string> res = s.letterCombinations("223");
for (int i = 0; i < res.size(); i++)
{
cout << res[i] << " ";
}
cout << endl;
system("pause");
return 0;
}