专栏持续更新50道算法题,都是大厂高频算法题,建议关注, 一起巧‘背’算法!
文章目录
- 题目
- 解法 滑动窗口
- 总结
题目
解法 滑动窗口
- 采取滑动窗口的方法降低时间复杂度
- 定义一个 map 数据结构存储 (k, v),其中 key 值为字符,value 值为字符位置
- 定义不重复子串的开始位置为 start,结束位置为 end。
- 随着 end 不断遍历向后,会遇到与 [start, end] 区间内字符相同的情况,此时将字符作为 key 值,获取其 value 值,并更新 start,此时 [start, end] 区间内不存在重复字符
- 时间复杂度为O(n),更加巧妙
class Solution {public int lengthOfLongestSubstring(String s) {int max = 0;if (s.length() == 0){return max;}// 定义散列表,key为字符,value为字符对应的下标Map<Character,Integer> map = new HashMap<>();// 定义不重复字符串的开始位置与结束位置,使用结束位置控制循环结束for (int start = 0,end = 0; end < s.length(); end++) {// 判断当前字符在散列表中是否有,如果有就是重复了,需要调整start的位置if (map.containsKey(s.charAt(end))){start = Math.max(start,map.get(s.charAt(end))+1);}// 判断当前字符串长度与最大长度那个大map.put(s.charAt(end),end);max = Math.max(max,end - start + 1);}return max;}}
总结
这道题看了很多题解,个人感觉这个比较好理解,还是老样子,自己动手在纸上画一画,画多了慢慢就会对这些数据结构熟悉起来,流程就可以在脑子里浮现了。
一定要自己动手写,代码部分我是先写注释,在自己根据注释写出来,再去对比题解。短期突击,这样’背题’更不容易忘。