3. 无重复字符的最长子串
题目描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
输入输出
1 2 3 4 5 6 7 8 9 10 11 12
| 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
|
基本思路
双指针控制一个滑动窗口,同时使用一个HashMap判断字母是否曾经出现过
- 如果HashMap没有该字母:更新
ans
- 如果HashMap包含该字母:更新
start
位置 更新ans
值
- 必须时刻保证
[start, end]
这一段字符串没有重复
java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public int lengthOfLongestSubstring(String s) { int ans = 0, n = s.length(); if(n == 0) return 0; Map<Character, Integer> map = new HashMap<>(); for(int end = 0, start = 0; end < n; end++){ char letter = s.charAt(end); if(map.containsKey(letter)){ start = Math.max(map.get(letter), start); } ans = Math.max(ans, end-start+1); map.put(letter, end + 1); } return ans; } }
|