回溯
当题目中出现所有组合的字眼时,就应该想到回溯
class Solution {
public:
unordered_map<int,string> phoneMap{
{2, "abc"},
{3, "def"},
{4, "ghi"},
{5, "jkl"},
{6, "mno"},
{7, "pqrs"},
{8, "tuv"},
{9, "wxyz"}
};
vector<string> result;
string s;
vector<string> letterCombinations(string digits) {
int len=digits.size();
if(len==0){
return result;//因为默认初始化一个size为0的向量
}
int index=0;//代表到了第几个数字
backtrack(digits,index);
return result;
}
void backtrack(string digits,int index){
if (index == digits.size()) {//如果到了最后的数字
result.push_back(s);//加入这个结果
return;
}
int digit = digits[index]-'0'; // 将index指向的数字转为int
string letters = phoneMap[digit]; // 取数字对应的字符集
for (int i = 0; i < letters.size(); i++) {
s.push_back(letters[i]); // 处理
backtrack(digits, index + 1); // 递归,注意index+1,一下层要处理下一个数字了
s.pop_back(); // 回溯
}
}
};
队列
每次取出队列中的第一个元素,和对应的字符挨个拼接,依次进入队列
class Solution {
public:
unordered_map<int,string> phoneMap{
{2, "abc"},
{3, "def"},
{4, "ghi"},
{5, "jkl"},
{6, "mno"},
{7, "pqrs"},
{8, "tuv"},
{9, "wxyz"}
};
vector<string> result;
string s;
vector<string> letterCombinations(string digits) {
int len=digits.size();
if(len==0){
return result;//因为默认初始化一个size为0的向量
}
//先往队列中加入一个空字符,注意这个细节
result.push_back("");
for(int i=0;i<len;i++){
//取出这个数字对应的所有字母
string letters=phoneMap[digits[i]-'0'];
//得到当前队列中有多少元素,挨个拿出来
int size=result.size();
for(int j=0;j<size;j++){
//获得第一个元素,从队列头去除
string temp=result[0];
result.erase(result.begin());
for(int k=0;k<letters.size();k++){
//然后跟"def"这样的字符串拼接,并再次放到队列中
result.push_back(temp+letters[k]);
}
}
}
return result;
}
};
使用STL deque数据结构
class Solution {
public:
unordered_map<int,string> phoneMap{
{2, "abc"},
{3, "def"},
{4, "ghi"},
{5, "jkl"},
{6, "mno"},
{7, "pqrs"},
{8, "tuv"},
{9, "wxyz"}
};
deque<string> result;
string s;
vector<string> letterCombinations(string digits) {
int len=digits.size();
if(len==0){
return {};
}
result.push_back("");
for(int i=0;i<len;i++){
string letters=phoneMap[digits[i]-'0'];
int size=result.size();
for(int j=0;j<size;j++){
string temp=result.front();
result.pop_front();
for(int k=0;k<letters.size();k++){
result.push_back(temp+letters[k]);
}
}
}
vector<string> res;
//赋值
res.assign(result.begin(),result.end());
return res;
}
};