
题目描述
3. 无重复字符的最长子串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
1 2 3
| 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
|
示例 2:
1 2 3
| 输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
|
示例 3:
1 2 3 4
| 输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
|
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
解题思路
暴力破解法
双重 for 循环
滑动窗口
其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!
如何移动?
我们只要把队列的左边的元素移出就行了,直到满足题目要求!
一直维持这样的队列,找出队列出现最长的长度时候,求出解!
代码实现
暴力破解法
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 32
| public class Solution3Case1 { public static int lengthOfLongestSubstring(String s) { char[] chars = s.toCharArray(); if (1 == chars.length) { return 1; } int max = 0; for (int i = 0; i < chars.length; i++) { List<Character> result = new ArrayList<>(); result.add(chars[i]); for (int j = i + 1; j < chars.length; j++) { if (result.contains(chars[j])) { if (max < result.size()) { max = result.size(); } break; } else { result.add(chars[j]); if (max < result.size()) { max = result.size(); } } } } return max; }
public static void main(String[] args) { String s = "abcabcbb"; System.err.println(lengthOfLongestSubstring(s)); } }
|
滑动窗口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class Solution3Case2 { public static int lengthOfLongestSubstring(String s) { HashSet<Character> set = new HashSet<>(); char[] chars = s.toCharArray(); int r = 0, max = 0; for (int i = 0; i < chars.length; i++) { if (i != 0) { set.remove(chars[i - 1]); } while (r < chars.length && !set.contains(chars[r])) { set.add(chars[r]); r++; } max = Math.max(max, set.size()); } return max; }
public static void main(String[] args) { String s = "abcabcbb"; System.err.println(lengthOfLongestSubstring(s)); } }
|