给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 10^4
s
由英文字母、数字、符号和空格组成
思路
滑动窗口+双指针+Map
- 哈希表 map 统计: 指针 j遍历字符 s,哈希表统计字符 s[j]最后一次出现的索引。
- 更新左指针 i : 根据上次左指针 i 和 map.get(s.charAt(j)),每次更新左边界i ,证区间 [i+1,j]内无重复字符且最大.
- 更新结果res : 取上次 res 和本次双指针区间[i+1,j]的宽度(即 j-i)中的最大值。
class Solution {//方法一:滑动窗口 + 哈希表public int lengthOfLongestSubstring(String s) {int length = s.length();int resLength = 0;//哈希表 map 统计: 指针 j遍历字符 s,哈希表统计字符 s[j]最后一次出现的索引。Map<Character,Integer> map = new HashMap<>();int i = -1;for(int j=0;j<length;j++){if(map.containsKey(s.charAt(j))){//更新左指针 i : 根据上次左指针 i 和 map.get(s.charAt(j)),每次更新左边界i ,//保证区间 [i+1,j]内无重复字符且最大。i = Math.max(i,map.get(s.charAt(j)));}map.put(s.charAt(j),j);resLength = Math.max(resLength,j-i);//更新结果res : 取上次 res 和本次双指针区间[i+1,j]的宽度(即 j-i)中的最大值。}return resLength;}
}