第一次做这种广度优先和深度优先的题目
从昨天想到今天,没想出来
看了答案理解了好久
深度优先是一种递归吧,我觉得。在递归这方面比较薄弱,我理解起来好困难。重新敲一遍的时候,也是很不熟悉。原因总结起来,就是没有深刻理解递归是什么,什么时候使用,怎么用,以及最后代码怎么写。在最后运行起来,也可以看到和广度优先相比,其执行时间和内存消耗都比较大。
广度优先感觉比较符合我们常规性逻辑,比较容易理解。但是其特别之处是,使用了 队列的先进先出(FIFO),一起通过中间的queSize来判断队列的长度,因为随着后面队列的增加,队列长度会有变化。但是其最后的执行时间和内存消耗都较少。
法一:深度优先
class Solution {
string digits;
vector
unordered_map
public:
vector
//dfs
this->digits = digits;
if(digits.empty()){
return res;
}
numStr =unordered_map
{'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;
vector
unordered_map
public:
vector
this->digits = digits;
if(digits.empty()){
return res;
}
numStr =unordered_map
{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}};
queue
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; } }