赞
踩
给定一个字符串 s
,请你找出其中不含有重复字符的 最长
子串
的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke"
,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
1.思路
最自然的思路是暴力求解法,遍历字符串,每个字符位置求解该位置的最长子串,二次优化是借助KMP算法,不需要遍历字符串,而是从与当前字符冲突的位置开始再次遍历。
然后发现滑动窗口法是最适合解决当前问题的方法,滑动窗口算法思路如下:
当 window[c]
值大于 1 时,说明窗口中存在重复字符,不符合条件,就该移动 left
缩小窗口了。
另外,要在收缩窗口完成后更新 res
,因为窗口收缩的 while 条件是存在重复元素,换句话说收缩完成后一定保证窗口中没有重复。
- class Solution {
- public int lengthOfLongestSubstring(String s) {
- Map<Character, Integer> window = new HashMap<>();
-
- int left = 0, right = 0;
- int res = 0; // 记录结果
- while (right < s.length()) {
- char c = s.charAt(right);
- right++;
- // 进行窗口内数据的一系列更新
- window.put(c, window.getOrDefault(c, 0) + 1);
- // 判断左侧窗口是否要收缩
- while (window.get(c) > 1) {
- char d = s.charAt(left);
- left++;
- // 进行窗口内数据的一系列更新
- window.put(d, window.get(d) - 1);
- }
- // 在这里更新答案
- res = Math.max(res, right - left);
- }
- return res;
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。