题外话: 感觉java自带的容器好慢,用队列速度直接慢一大截
题目描述:
思路:
朴素
:
双重循环遍历所有可能
朴素:\\双重循环遍历所有可能
朴素:双重循环遍历所有可能
哈希
+
滑动窗口优化
:
模拟过程发现
,
只有字母重复出现时
,
左端才会移动
所以使用滑动窗口维护就可以快速算出最大值
哈希 + 滑动窗口优化:\\模拟过程发现,只有字母重复出现时,左端才会移动\\所以使用滑动窗口维护就可以快速算出最大值
哈希+滑动窗口优化:模拟过程发现,只有字母重复出现时,左端才会移动所以使用滑动窗口维护就可以快速算出最大值
代码:
//哈希 + 滑动窗口
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int i = -1, max = 0, length = s.length();
for (int j = 0; j < length; j++) {
//出现某个重复字母,直接将左端更新至没有某个重复字母为止
if(map.containsKey(s.charAt(j))) {
i = Math.max(i, map.get(s.charAt(j)));
}
//更新某个字母的最新位置
map.put(s.charAt(j), j);
//计算长度: j - (i + 1) + 1
max = Math.max(max, j - i);
}
return max;
}
}