滑动窗口(2) --hot 100 in leetcode
无重复字符的最长子串
算法概述
题目要求是返回给出字符串的最长无重复子串长度。同样要用到双指针,但此时双指针的功能不在于 减少遍历 ,而在于 定位 ,也就是创建滑动窗口。
- 时间复杂度为O(n):看似有两个循环,但实际上对应滑动窗口两侧,滑动窗口只往 一个方向 动态变化
- 空间复杂度为O(∣Σ∣):字符集大小,因为要创建容器类对应字符串映射
JAVA
1 | class Solution { |
重要实例方法及属性(JAVA)
Set<Character> occ=new HashSet<Character>()
:JAVA使用Character
代表基本类型char
的包装类str.length()
:字符串长度str.charAt(index)
:返回参数索引处的字符set.add(element)
:添加非重复元素(如重复则不再添加),返回true或falseset.remove(element)
:删除元素,返回true或falseset.contains(element)
:是否存在某元素,返回true或flase
C++
1 | class Solution { |
重要实例方法及属性(C++)
str[]
:返回值引用str.size()
:与JAVA访问字符串长度属性的方法不同unordered_set<char>
:C++没有基本类型的包装类set.erase(&element_val)
:按值移除元素(重载),返回删除元素数量(对于集合0或1)set.count(&element_val)
:计数元素出现次数,返回次数(对于集合0或1)set.insert(&element_val)
:插入树或哈希表,具体看实现
注意
滑动窗口由左指针负责遍历,右指针负责符合条件的定位,滑动窗口本身只是一个 工具 ,并不是用于存储最终结果的,所以需要变量存储最终结果,这与双指针一样。
找到字符串中所有字母异位词
算法概述
题目要求为找到给出字符串中所有目标字符串的字母改变顺序后的变形,并给出它们起始的索引。使用滑动窗口,这道题比上面一道题海多了一层抽象,因为这个题目的要求是 找到所有 , 而不是 找到某一个特殊的 。这也就意味着滑动窗口会用于统计最后结果的工具变量之间仍然不是直接联系,在这里, differ 是用来统计最终结果的,但与之交互的是 count ,而不是滑动窗口,后者根据滑动窗口的移动统计所有字符频次,而前者则只关心整体差异是否为0,只有一个变量。
- 时间复杂度为O(n+m+Σ):n+m为两个字符串的长度,∑为可能字符集的长度
- 空间复杂度为O(∑):需要存储字符集
JAVA
1 | class Solution { |
C++
1 | // 除了用vector以及vector.emplace_back(),没有区别 |
注意
在面对不能直接用相应算法直接解决的问题前,要想想有没有可不可以添加一些抽象关系进去,使不合适的输出或者输入转变为合适的输入输出,如滑动窗口、双指针这样的算法其实本身思想非常简单,但如何在此之上搭积木,才是我们要思考的问题。
- Title: 滑动窗口(2) --hot 100 in leetcode
- Author: tobegold574
- Created at : 2024-11-19 10:55:52
- Updated at : 2024-12-02 13:32:52
- Link: https://tobegold574.me/2024/11/19/滑动窗口-2-hot-100-in-leetcode/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments