描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解决方案
方法一:滑动窗口思路
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution {
public static int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) { return 0; } int len = s.length(); int res = 1; HashSet<Character> occ = new HashSet<>(); for (int i = 0, j = i; i < len; i++) { while (j < len && !occ.contains(s.charAt(j))) { occ.put(s.charAt(j)); res = Math.max(res, j - i + 1); j++; } if (j == len) { return res; } occ.remove(s.charAt(i)); } return res; }
}
|
方法二:队列法
滑动窗口本质上也是队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution {
public static int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) { return 0; } Queue<Character> queue = new ArrayDeque<>(); HashSet<Character> occ = new HashSet<>(); int res = 1; for (int i = 0; i < s.length(); ) { char c = s.charAt(i); if (!occ.contains(c)) { queue.add(c); occ.add(c); i++; res = Math.max(queue.size(), res); } else { Character cc = queue.poll(); occ.remove(cc); } } return res; } }
|