滑动窗口例题:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/
题目
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题解
-
解法一
-
思路
-
滑动窗口,hashset,双指针法
-
-
代码
-
class Solution { public int lengthOfLongestSubstring(String s) { int max = 0; HashSet<Character> hs = new HashSet<>(); for (int l=0,r=0;r<s.length(); r++){ Character c = s.charAt(r); while (hs.contains(c)){//模拟滑动窗口 hs.remove(s.charAt(l++)); } hs.add(c); max = Math.max(max,r-l+1); } return max; } }
-
-
-
-
解法二
-
思路
-
双端队列
-
-
代码
-
class Solution { public int lengthOfLongestSubstring(String s) { int max = 0; Deque<Character> deque = new ArrayDeque<>(); for (int i = 0; i<s.length(); i++){ if(!deque.contains(s.charAt(i))){ deque.addLast(s.charAt(i)); }else { max = Math.max(deque.size(),max); while(deque.peekFirst()!=s.charAt(i)){ deque.removeFirst(); } deque.removeFirst();//ascaakn,同时遇到两个a deque.addLast(s.charAt(i)); } } max = Math.max(max,deque.size()); return max ; } }
-
-