提到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的一些小小的总结(一)的更多相关文章

  1. 图的深度优先遍历算法(DFS)

    搜索算法有很多种,本次文章主要分享图(无向图)的深度优先算法.深度优先算法(DFS)主要是应用于搜索中,早期是在爬虫中使用.其主要的思想有如下: 1.先访问一个节点v,然后标记为已被访问过2.找到第一 ...

  2. c++ 深度优先算法

    #include <iostream> using namespace std; #define VertexNum 9 /*定义顶点数*/ struct Node /*声明图形顶点结构* ...

  3. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  4. 广度优先算法(BFS)与深度优先算法(DFS)

    一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...

  5. [算法入门]——深度优先搜索(DFS)

    深度优先搜索(DFS) 深度优先搜索叫DFS(Depth First Search).OK,那么什么是深度优先搜索呢?_? 样例: 举个例子,你在一个方格网络中,可以简单理解为我们的地图,要从A点到B ...

  6. 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    参考网址:图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) - 51CTO.COM 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath ...

  7. [ACM训练] 算法初级 之 搜索算法 之 深度优先算法DFS (POJ 2251+2488+3083+3009+1321)

    对于深度优先算法,第一个直观的想法是只要是要求输出最短情况的详细步骤的题目基本上都要使用深度优先来解决.比较常见的题目类型比如寻路等,可以结合相关的经典算法进行分析. 常用步骤: 第一道题目:Dung ...

  8. 深度优先搜索(DFS)

    定义: (维基百科:https://en.wikipedia.org/wiki/Depth-first_search) 深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿 ...

  9. Java与算法之(5) - 老鼠走迷宫(深度优先算法)

    小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先 ...

随机推荐

  1. Spring Bean配置加载为BeanDefinition全过程(注解配置)

    生产中有很多形式的的配置方式,本文仅分析注解配置.对于其他形式的配置区别主观以为主要在配置文件的解析过程不同,不一一分析了.本文以利用Dubbo框架开发rpc服务端为例详细阐述配置类的解析.数据保存. ...

  2. ARM7、ARM9、ARM11、ARM-Cortex系列的关系

    参考资料: https://zhuanlan.zhihu.com/p/92315825 https://zhuanlan.zhihu.com/p/82337495 ARM是Advanced RISC ...

  3. Mybatis的介绍和基本使用

    巨人的肩膀 Mybatis的介绍和基本使用(1) (qq.com) Mybatis SQL映射文件详解(2) (qq.com)

  4. blender导入灰度图生成地形模型

    安装软件 在此处下载blender并安装. 添加平面 1.打开blender,右键删除初始的立方体. 2.shift+a选择平面添加进场景: 3.按下s键鼠标拖动调节平面大小确定后按下鼠标左键: 4. ...

  5. VUE项目二级菜单刷新时404 nginx

    原因:vue项目的路径时虚拟路径,并不存在,所以用nginx去请求请求不到,所以vue项目做了两部调整: 1.所有的请求后端接口地址前端写死 2.nginx里把所有的接口转发后端删掉,并添加以下内容 ...

  6. [杂记]LeTeX中使用tikz画图的一些实例

    出处:http://www.texample.net/tikz/examples/all/ 上述网站中的实例非常丰富,将代码修改一下再编译就能明白是什么意思,故不再赘述.

  7. linux安装ngixn

    卸载ngxin(第一次安装请略过) 1.检查nginx是否启动,是否安装ngxin 检查是否安装nginx命令 rpm -qa|grep nginx 检查nginx是否启动命令: pa -ef|gre ...

  8. BI数据可视化工具怎么选?用这款就够了!

    任何一项产品的选择都需要谨慎而全面,BI数据可视化工具的选择就更不用说了.作为企业的IT部门,如果没有良好的BI工具支持,IT部门将会十分容易陷入困境.那么面对多元化的BI工具市场,IT部门该如何选择 ...

  9. Excel真的是三维地图可视化制作最好的选择吗?

    随着数据在当下互联网快速发展下变的维度更广,数量更大.结构越来越复杂,人们想要更加清晰,快速的认知和理解一份数据,传统的二维平面图表已经不能满足需求,三维可视化技术越结合多媒体技术.网络技术以及三维镜 ...

  10. 【C#TAP 异步编程】构造函数 OOP

    原文:异步 OOP 2:构造函数 (stephencleary.com) 异步构造带来了一个有趣的问题.能够在构造函数中使用会很有用,但这意味着构造函数必须返回一个表示将来将构造的值,而不是构造的值. ...