力扣之路03—无重复字符的最长子串

以为 a b c a b c b b 为例,

for 循环第一步,将a 放在 currentChar中, 然后 while 循环判断set里是否存在a, 由于是第一步,也就是不存在a,因此不进入while循环,直接被存入 set 里 按此步骤执行,

一直到 right 等于3的时候,也就是第二个a被放入了 currentChar 这时 while 判断出 currentChar中存在了a,

也就是发现了重复元素,因此进入while循环, 这时移除掉 lift 所指的元素,也就是a,然后left+1,lift向右移动了一个,在while完成去重后,把currentChar存入到set里,然后 maxLen 里计算两个right与lift之间相差多少再加上1,得出最长无重复子串的长度,因为right一直在向右移动,可以说right必然大于等于 lift 依此类推,一直执行完for循环

 1 class Solution {
 2     public int lengthOfLongestSubstring(String s) {
 3         // 定义 HashSet 存储当前窗口内出现的字符
 4         // 作用:快速判断某个字符是否已经在窗口内
 5         Set<Character> set = new HashSet<>();
 6         // 窗口的左边界,指向当前子串的起始位置,初始为0
 7         int left = 0;
 8         // 记录迄今为止找到的最长无重复子串的长度
 9         int maxLen = 0;
10         // for 循环中 right 从 0 到 s.length()-1
11         for(int right = 0; right < s.length(); right++){
12             // 取出当前 right 指向的字符
13             char currentChar = s.charAt(right);
14 
15             // 如果当前字符已经存在于 HashSet 中(说明窗口内有重复)
16             // 需要移动左指针,不断缩小窗口,直到移除那个重复字符
17             while(set.contains(currentChar)){
18                 // 移除左指针指向的字符,因为它已经不在新窗口内了
19                 set.remove(s.charAt(left));
20                 left++;
21             }
22             // 此时窗口内已经没有重复字符(因为上面 while 确保移除了重复项)
23             // 将当前字符加入到 HashSet 中,扩展窗口
24             set.add(currentChar);
25 
26             //  计算当前窗口的长度:right - left + 1
27             //  并更新 maxLen,保留较大的值
28             maxLen = Math.max(maxLen, right - left + 1);
29         }
30         // 遍历结束,返回最长无重复子串的长度
31         return maxLen;
32     }
33 }

 

posted @ 2026-05-24 21:35  NO-PATS  阅读(7)  评论(0)    收藏  举报