二叉树前序遍历
无重复字符的最长子串
最小覆盖子串
二叉树前序遍历
问题:
给你一棵二叉树的根节点 root ,返回其节点值的 前序遍历 。
代码示例:
递归法:
迭代法:
解题思路:
思路很简单,创建一个临时节点,挨个反转节点之间的关系,临时头结点为temp,每次移动temp和curr即可
无重复字符的最长子串
题目:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
代码示例:
解题思路:
这道题很多人说采用的浮窗法,我觉得说是双指针法更合适。如图:
看上图,题目是找不重复的最长子串,那么就意味着字符串两边的字符肯定是一样的,以此为入手点:
定义一个Map保存字符和他最后出现的位置。
定义一个指针,名字为start,指向字符串最开始,用来记录当前不重复子串的起点。
定义一个指针,一个是从前往后遍历,每次遇到一个字符,将这个字符作为key,他当前的位置作为value存储下来,名字为end
end指针一次向后遍历,同时计算end到start之前的长度,如果这次遍历时取到的字符在Map中存在,那么更新start的位置为Map中存储的上一次的位置和start两者取最大,因为start标记的已经重复过的,如果新值比start小,说明在新值后已经有过一个比他更小的重复段了,他就不是最大的不重复。
最小覆盖子串
题目:
给你一个字符串s、一个字符串t 。返回s中涵盖t所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “”
示例 1:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
示例 2:
输入:s = "a", t = "a"
输出:"a"
示例 3:
输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。
示例代码:
解题思路:
这里采用的是窗口法,主要的操作流程如下图:
1 创建一个存储Map,记录当前窗口中包含的字母以及对应的数量。
2 创建左右两个指针
3
3.1 如果当前存储map没有包含子字符串,那么右指针向右;
3.2 如果当前存储map有完整包含子字符串,那么左指针向右;
4 如果上面3.2左指针向右移动后不包含,那么异动前就是最小覆盖子串候选结果之一。移动完之后,继续进行第三步的操作,知道得到新的候选结果,比较候选结果中字符的数量,取最小值。