WELCOME TO Pluto134340小行星

清风湿润,茶烟轻扬。

8.无重复字符的最长子串

3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长  的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

思路:

left 控制当前窗口的左端,当前位置 i 为窗口的右端,自动加一不用控制。只需要比较新进入的字符 ss 窗口里有没有,如果有left需要指向窗口里 ss 的笑一个位置(因为新的ss需要进来,旧的ss不用保留)

用哈希存字符串中的字符以及对应下标,当出现重复字符时,需要改哈希中的下标。

 

要理解 left = Math.max(left,map.get(s.charAt(i)) + 1);需要回归到滑动窗口的原理上。

窗口中始终是无重复字母的字符串。
我们通过窗口的左界和右界控制窗口。

右界不用特意操作,因为它是+1,+1地涨上去,记得在循环里+1就好。

左界:每当有一个字符曾经出现过,就需要判断左界。

 1 class Solution {
 2     public int lengthOfLongestSubstring(String s) {
 3         if(s.length()==0)return 0;
 4         HashMap<Character ,Integer> map = new HashMap<Character ,Integer>();
 5         int max=0,left=0;
 6         for(int i = 0 ; i<s.length() ;i++){
 7             char ss = s.charAt(i);
 8             if(map.containsKey(ss)){
 9                 left=Math.max(left,map.get(ss)+1);
10             }
11             map.put(ss,i);
12             max = Math.max(max,i-left+1);
13         }
14         return max;
15     }
16 }
View Code

还可以,虽然我没写出来

 

posted @ 2026-01-09 10:46  Pluto134340  阅读(32)  评论(0)    收藏  举报