深度优先遍历(DFS)

思路:从图中一个未访问的顶点V开始,沿着一条路一直走到尽头,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到尽头…,不断递归重复此过程,直到所有顶点都遍历完成。

特点:不撞南墙不回头,先走完一条路,再换另一条路,继续走,和数的前序遍历一样

树的深度优先遍历


1.从根节点1开始遍历,它的子节点有2,3,4,先遍历节点2,再遍历节点5,之后遍历节点9.

2.第一条路已经走到底了,9是叶子节点,没有子节点,从9回退到节点5,看节点5是否还有没有遍历的节点,若没有,继续回退,回退到节点2,节点2还是没有未遍历的节点,继续回退,回退到根节点1。
发现根节点1有两个未遍历的子节点3和4,选择节点3,继续向下遍历,

和步骤2一样,一条路遍历到最后一个叶子节点10,开始回退,回退到6,继续回退到3,发现节点3未遍历,此时遍历节点7.

从节点7回退,回退到节点3,再回退到根节点1,选择未遍历的子节点4,一直往下遍历,依次遍历节点4,节点8.

完整节点的遍历顺序:1,2,5,9,3,6,10,7,4,8

综上所述:就会发现树的深度优先遍历就是数的前序遍历

递归实现:前序遍历(根节点,左节点,右节点)


1.题目:Letter CasePermutation

  • English

Given a string S, we can transform every letter individually to be lowercase or uppercase to create another string. Return a list of all possible strings we could create.

Examples:
Input: S = “a1b2”
Output: [“a1b2”, “a1B2”, “A1b2”, “A1B2”]

Input: S = “3z4”
Output: [“3z4”, “3Z4”]

Input: S = “12345”
Output: [“12345”]

Note:
S will be a string with length at most 12.
S will consist only of letters or digits.

  • 中文:

给定一个字符串S,我们可以将每个字母分别转换为小写或大写以创建另一个字符串。返回我们可以创建的所有可能字符串的列表。

示例:
输入:S=“a1b2”
输出:[“a1b2”,“a1B2”,“A1B2”,“A1B2”]

输入:S=“3z4”
输出:[“3z4”,“3Z4”]

输入:S=“12345”
输出:[“12345”]

注:
S将是一个长度不超过12的字符串。
S将仅由字母或数字组成。


  • 分析思路:
    由于输入的字符串中只有字母和数字,小写字母的ASCll码范围是:97~ 122,大写字母的ASCll码范围是:65~ 90,数字字符的范围是:49~57。观察到数字字符的ascll码比字母都要小而且小写字母比对应的大写字母大32,采用异或32刚好是2的32次方,所以相当于小写字母的二进制表示ASCll码从右往左的第6位由0变成1就变成了对应的大写字母同理对于大写字母把第六位的1变成0就是大写向小写的转换,这个过程可以用S[i]^32来完成。

  • 代码:


class Solution{public:vector<string> ans; //全局变量vector<string> letterCasePermutation(string S){dfs(S,0); //搜索所有字符串和当前位 return ans;}void dfs(string S,int u){ //传字符串与当前枚举到第几位 if(u==S.size()){ans.push_back(S);return;}dfs(S,u+1);//当前位不变 if(S[u]>='A')//若是字母 {S[u]^=32; //大写变小写,异或32 ASII:A=65,a=97 dfs(S,u+1);int main(){} }}
};

2.题目:Combinations

English:

Given two integers n and k, return all possible combinations of k numbers out of 1 … n.

For example,
If n = 4 and k = 2, a solution is:

[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

中文:

给定两个整数n和k,返回1中k个数的所有可能组合…n。

例如,

如果n=4,k=2,则解为:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]


  • 分析思路:

搜组合数(保证不重不漏),从前往后排列1,2,3…n从前往后看每个数是不是要选,从前往后选k个数,保证所选的次序是有序的,从前往后选(从小到大),这样就不用再去考虑顺序问题,因为选好的数都是按顺序排列好的,(顺序不会导致产生新的方案,不会重复)

  • 代码:
class Solution{public:vector<vector<int> > ans;  //全局变量 vector<vector<int> > combine(int n,int k){vector<int> path;  //方案 dfs(path,1,n,k); //传参,方案,1-n,k:需要选的数 return ans;}void dfs(vector<int> &path,int start,int n,int k) //start:当前可选起始位置,n:总数,k:当前需要选的数 {if(!k){  //出口条件,不需要选任何数 ans.push_back(path); //加入计数中 return; }for(int i=start;i<=n;i++) //可选起始位置 {path.push_back(i); //更新状态 ,加入i dfs(path,i+1,n,k-1); //递归搜索 ,当前数为i,所以下一个可选数为i+1(保证选得数从小到大),剩余选k-1个数 path.pop_back();//回溯,恢复现场,前面加入i,在此处把最后一个元素删掉 }}
};

深度优先遍历(DFS)- Letter CasePermutation - Combinations相关推荐

  1. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  2. Java实现深度优先遍历-DFS

    Java实现深度优先遍历-DFS 实现功能:使用深度优先遍历算法DFS计算地铁指定起点站和终点站之间的所有路径 1.构造地铁站点数据结构 地铁站点数据结构包含2个属性,1个站点名,1个邻接站点列表 i ...

  3. 图的深度优先遍历DFS(JAVA)

    图的深度优先遍历算法 在此介绍图的基本算法之一的深度优先遍历(DFS)算法 广度优先搜索(BFS). 什么是DFS 图是由节点(Node)和路径(Route)组成的一种数据结构,用于反应各节点间的关系 ...

  4. 华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏.玩家需要根据9X9盘面上 ...

  5. 图——深度优先遍历(DFS)实现有向无环图的逆拓扑排序

    对图的深度遍历与对树的深度遍历思想类似,采用的是递归函数的办法. 如果是非连通图,则DFS遍历所有顶点即可. //Graph 图 //vertex 顶点,用一个int型变量表示//返回有向图G中顶点v ...

  6. 图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现

    遍历的定义: 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算. 一:深度优先遍历(DFS) 1,在访问图中某一起始顶点V后,由V ...

  7. Java数据结构之图的基本概念和算法,深度优先遍历DFS,广度优先遍历BFS(图解)

    文章目录 前言 一.图的基本概念 1.图的定义 2.基本术语 二.图的基本算法 1.初始化图 2.插入顶点和边 3.矩阵打印 4.返回第一个邻接结点的下标 5.返回第一个邻接结点的下一个结点的下标 三 ...

  8. Unique Binary Search Trees ll -深度优先遍历DFS

    题目:Unique Binary Search Trees ll English: Given an integer n, generate all structurally unique BST's ...

  9. 数据结构-图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    https://www.cnblogs.com/qzhc/p/10291430.html 最后一个广度优先有错误,H不指向E,只有G指向E,所以顺序应该是ABCFDHGE

最新文章

  1. 【作业】组合数据类型练习,英文词频统计实例
  2. intimidated
  3. A quick complete tutorial to save and restore Tensorflow models
  4. 【小白学习tensorflow教程】二、TensorBoard可视化模型训练
  5. 【faster-rcnn】训练自己的数据集时的坑
  6. 弗吉尼亚理工计算机科学排名,2020年弗吉尼亚理工大学排名TFE Times美国最佳计算机科学硕士专业排名第45...
  7. Spring----最小化Spring配置
  8. 实现较低的计时器粒度以重传TCP(RTO):时间轮算法如何减少开销
  9. robotframework的学习笔记(十六)----robotframework标准库String
  10. jquery 如何插入元素
  11. 苹果手机显示iphone已停用连接itunes_iTunes备份道理我都懂,但我依然不想备份的?...
  12. Bibles_Numpy离线文档
  13. app测试环境搭建(适用monkey测试及日志分析)
  14. 根据经纬度获取位置信息
  15. 各类软件激活码(更新中)
  16. NetBeans ide操作流程及注意事项
  17. 〖2011.08.19〗秋无痕常用软件全功能装机光盘2011年八月版(支持64位WIN7)
  18. .net core Fleck WebSocket使用笔记
  19. 【USACO题库】1.5.4 Checker Challenge跳棋的挑战
  20. 购物商城html源码asp,购物商城 html

热门文章

  1. python编程语言-初学者最容易学的六种编程语言
  2. python必背100源代码-学会这个Python库,至少能减少100行代码
  3. 学python能干什么工作-什么是Python?学完之后能做哪些工作?
  4. python语言的读法-就语法而言,Python 这个语言怎么样?
  5. python用什么来写模块-Python常用模块——模块介绍与导入
  6. 语音识别错误太多?高科技巨头们偏偏“不信邪”
  7. python中的缩进是长度统一吗_python缩进长度是否统一
  8. oracle byte 转string,C# 中 byte 转化成string
  9. FFmpeg源代码简单分析:av_find_decoder()和av_find_encoder()
  10. 矩阵方程求解最快c语言算法,求助! C语言用矩阵求解方程组