深度优先算法--对DFS的一些小小的总结(一)
提到DFS,我们首先想到的是对树的DFS,例如下面的例子:
求二叉树的深度
int TreeDepth(BinaryTreeNode* root){
if(root==nullptr)return 0;
int left=TreeDepth(root->left);
int right=TreeDepth(root->right);
return (left>right)?(left+1):(right+1);
}
求二叉树的最小路径深度
int TreeDepth(BinaryTreeNode* root){
if(root=nullptr)return 0;
int left=TreeDepth(root->left);
int right=TreeDepth(root->right);
if(left==0||right==0)return 1+left+right;
return 1+min(left,right);}
或许考察的更深入一些
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
vector<vector<int> >path;//用来记录路径
vector<int> pathnum;
vector<vector<int> >FindPath(TreeNode* root,int expectNumber){
if(root==nullptr)return path;
int curSum=0;
curSum+=root->val;
pathnum.push_back(root->val);
bool isleaf=!(root->left)&&!(root->right);
if(curSum==expectNumber&&isleaf)path.push_back(pathnum);
if(root->left)FindPath(root->left,expectNumber-root->val);
if(root->right)FindPaht(root->right,expectNumber-root->val);
curSum-=root->val;
pathnum.pop_back();
return path;
}
有上面可以看出,DFS面对树的搜索,采用递归,有很好的效果,通常的步骤是
搜索到叶节点,采取的措施
#如果当前状态满足最终的解,则添加到最终解中
# 遍历构造空间,是当前构造解可添加处理操作的空间
# 如果当前遍历的操作对于当前阶段是可行的,则对当前构造解施加操作
#若满足从当前状态下进入下一步处理,进一步搜索解
#从下一个状态搜索状态中返回,无论下一层的是否什么状态。回复本阶段的状态,搜索笨阶段另外可施加的状态
进行操作
上面讲了这么多,然而最近经常发现DFS被应用于字符串或数组的搜索,那么在什么样的情况下需要使用到DFS以及我们使用DFS会达到什么样的效果呢?
下面是一个字符串中是否有回文字段的题,典型的符合上面的状态解释
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
For example, given s ="aab",
Return
{
["aa","b"],
["a","a","b"]
}
void dfs(string s,vector<string> &path,vector<vector<string> >&res)
{
if(s.empty()){
res.push_back(path);
return;
}
for(int i=0;i<s.size();i++){
string s.substr(0,i+1);
if(Is_palindrome(a))//Is_palindrome判断是否是回文字段函数,这里省略不写了
path.push_back(s.substr(0,i+1));
dfs(s,substr(i+1),path,res);
path.pop_back();
}
}
vector<vector<string> >patition(string s){
vector<vector<string> >res;
vector<string> path;
dfs(s,path,res);
return res;
}
深度优先算法--对DFS的一些小小的总结(一)的更多相关文章
- 图的深度优先遍历算法(DFS)
搜索算法有很多种,本次文章主要分享图(无向图)的深度优先算法.深度优先算法(DFS)主要是应用于搜索中,早期是在爬虫中使用.其主要的思想有如下: 1.先访问一个节点v,然后标记为已被访问过2.找到第一 ...
- c++ 深度优先算法
#include <iostream> using namespace std; #define VertexNum 9 /*定义顶点数*/ struct Node /*声明图形顶点结构* ...
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- 广度优先算法(BFS)与深度优先算法(DFS)
一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...
- [算法入门]——深度优先搜索(DFS)
深度优先搜索(DFS) 深度优先搜索叫DFS(Depth First Search).OK,那么什么是深度优先搜索呢?_? 样例: 举个例子,你在一个方格网络中,可以简单理解为我们的地图,要从A点到B ...
- 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)
参考网址:图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) - 51CTO.COM 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath ...
- [ACM训练] 算法初级 之 搜索算法 之 深度优先算法DFS (POJ 2251+2488+3083+3009+1321)
对于深度优先算法,第一个直观的想法是只要是要求输出最短情况的详细步骤的题目基本上都要使用深度优先来解决.比较常见的题目类型比如寻路等,可以结合相关的经典算法进行分析. 常用步骤: 第一道题目:Dung ...
- 深度优先搜索(DFS)
定义: (维基百科:https://en.wikipedia.org/wiki/Depth-first_search) 深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿 ...
- Java与算法之(5) - 老鼠走迷宫(深度优先算法)
小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先 ...
随机推荐
- linux 普通分区与lvm分区
安装linux系统时 有时候会提示lvm分区与标准分区 首先普及一下lvm分区:lvm是 logical volume manager (逻辑卷管理),linux环境下对磁盘分区的管理:他解决了安装系 ...
- c++ 子类与父类之间的类型转换
子类与父类之间的类型转换 先给一段代码 class Base { public: int a = 10; }; class pub_Derv : public Base { Base *getBase ...
- Centos下Ambari2.7.5的编译和安装
前言 终于,要开始写点大数据相关的文章了.当真的要开始写老本行的时候,还是考虑了挺久的.一是不知道从何处写起,二是如何能写点有意思的. 我们常说,过程比结果重要.也是有很多人喜欢准备完全之后,才会开始 ...
- python中面向对象VS面向过程
面向过程编程:首先分析出解决问题所需要的步骤(即"第一步做什么,第二步做什么,第三步做什么"),然后用函数实现各个步骤,再依次调用. 面向对象编程:会将程序看作是一组对象的集合,用 ...
- WAF、IDS、IPS
WAF:https://blog.csdn.net/gufenchen/article/details/93485351 IDS:https://blog.csdn.net/coldeye/artic ...
- [题解]Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round) - A. Basic Diplomacy
[题目] A. Basic Diplomacy [描述] Aleksey有n个朋友,有一个m天的假期,每天都需要一个朋友来陪他.给出每天有空的朋友的编号,要求同一个朋友来的天数不能超过m/2上取整.求 ...
- [旧][Android] 命名规范和编码规范
备注 原发表于2016.05.07,资料已过时,仅作备份,谨慎参考 前言 本文适用范围:已参加项目开发的人 写这篇文章的目的是为方便地对代码进行管理,让整个团队的代码规范化.这里的部分规定可能和你在其 ...
- 跟Excel说拜拜,这款可视化报表制作工具入股不亏!
相信很多人如果看到漂亮的图表都会很感叹,"为什么可以做的这么漂亮,这么好看?","这个应该怎么做呢?用什么工具可以实现呢?".制作漂亮的可视化一般有这样几个方 ...
- 华为RH2288H服务器引导ServiceCD安装Windows Server操作系统
安装准备 ServiceCD光盘. Windows操作系统安装光盘. 物理光驱. 使用虚拟控制台远程安装操作系统时,需要准备以下软件: ServiceCD光盘或ServiceCD ISO文件. Win ...
- 踢出某正在访问的用户||永久禁止某IP访问
转至:https://blog.csdn.net/weixin_34408717/article/details/85527305?utm_medium=distribute.pc_aggpage_s ...