leetcode-电话号码的字母组合

第一次做这种广度优先和深度优先的题目
从昨天想到今天,没想出来
看了答案理解了好久
【leetcode-电话号码的字母组合】深度优先是一种递归吧,我觉得。在递归这方面比较薄弱,我理解起来好困难。重新敲一遍的时候,也是很不熟悉。原因总结起来,就是没有深刻理解递归是什么,什么时候使用,怎么用,以及最后代码怎么写。在最后运行起来,也可以看到和广度优先相比,其执行时间和内存消耗都比较大。
广度优先感觉比较符合我们常规性逻辑,比较容易理解。但是其特别之处是,使用了 队列的先进先出(FIFO),一起通过中间的queSize来判断队列的长度,因为随着后面队列的增加,队列长度会有变化。但是其最后的执行时间和内存消耗都较少。


leetcode-电话号码的字母组合
文章图片
题目 法一:深度优先
class Solution {
string digits;
vectorres;
unordered_map numStr;
public:
vector letterCombinations(string digits) {
//dfs
this->digits = digits;
if(digits.empty()){
return res;
}
numStr =unordered_map{{'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"},{'6',"mno"},
{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}};
dfs("",0);
return res;
}
void dfs(string result,int index){
int digitsSize = digits.size();
if(index == digitsSize){
res.push_back(result);
return;
}
char targetChar = digits[index];
string targetStr = numStr[targetChar];
for(auto tmpChar:targetStr){
dfs(result+tmpChar,index+1);
}
return;
}


};
法二:广度优先
class Solution {
string digits;
vectorres;
unordered_map numStr;
public:
vector letterCombinations(string digits) {
this->digits = digits;
if(digits.empty()){
return res;
}
numStr =unordered_map{{'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"},{'6',"mno"},
{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}};
queuequeStr;
queStr.push("");
for(int i =0; i int queSize = queStr.size();
for(int j =0; j string tmpStr = queStr.front();
queStr.pop();
char tmpChar = digits[i];
string targetStr = numStr[tmpChar];
for(auto tmpC:targetStr){
queStr.push(tmpStr+tmpC);
}
}
}
while(!queStr.empty()){
string tmp = queStr.front();
queStr.pop();
res.push_back(tmp);
}
return res;
}
}


leetcode-电话号码的字母组合
文章图片
题解记录

    推荐阅读