基于HashSet的字符串最长子串长度:代码else分支及start变量解惑
嘿,我来帮你拆解这段最长无重复子串代码里的关键部分~
首先明确这段代码的核心思路:它用的是滑动窗口+哈希表的高效解法,用来定位字符串中最长的不含重复字符的子串。
1. 变量start的含义
start是当前我们正在考察的无重复子串的左边界索引,也就是滑动窗口的左端点。它的核心作用是标记:从这个位置到当前遍历的右端点end之间的子串,是一个暂时没有重复字符的候选子串。
举个实际例子:假设字符串是"abcabcbb",当我们遍历到第二个a(索引3)的时候,发现a已经在哈希表里存过(索引0),而且这个索引0是大于等于当前的start(0)的——这说明a在当前窗口内重复了。这时候就需要把start更新为0+1=1,让新的窗口从索引1开始,避免包含重复的a。
2. else分支的功能
先看if分支的判断条件:s[end] in char_map and char_map[s[end]] >= start,这个条件是在检查当前字符已经在当前窗口内出现过(它的上一次出现位置在start及之后,属于当前窗口的范围)。
那else分支处理的就是两种安全情况:
- 当前字符
s[end]从来没在整个字符串里出现过; - 当前字符之前出现过,但它的上一次出现位置在
start的左边(也就是不在当前窗口范围内,不会破坏当前窗口的无重复性)。
在这两种情况下,当前窗口可以安全地把s[end]纳入进来,所以我们需要更新最长子串的长度:用当前窗口的实际长度(end - start + 1)和之前记录的max_len做比较,把更大的值存到max_len里。
再举个例子:还是"abcabcbb",当遍历到b(索引1)的时候,b不在哈希表里,进入else分支,max_len更新为1-0+1=2;遍历到c(索引2)时,同样进入else分支,max_len更新为3。
最后不管是if还是else分支,都会把当前字符的最新索引存入哈希表,这样下次遇到重复字符时能快速定位它的上一个位置。
内容的提问来源于stack exchange,提问作者John Thomas

