Leetcode最长无重复子串代码中cnt[s[j]]的语法与逻辑疑问
最长无重复字符子串解法中数组索引问题解答
核心疑问解答:cnt[s[j]] 不是数组嵌套
这是C语言里用字符的ASCII值作为数组下标的常见用法,和数组嵌套完全无关。下面拆解工作原理:
1. 先理解s[j]的本质
s是char类型数组,存储字符串的每个字符。在C语言中,char本质是8位整数,对应字符的ASCII编码值:
- 比如字符
'a'的ASCII码是97,当s[j]指向'a'时,s[j]的实际取值就是整数97; - 字符
'0'的ASCII码是48,s[j]取到的就是48,以此类推。
2. cnt[s[j]]的工作逻辑
cnt是长度为255的int数组,初始化全为0,用来统计每个字符的出现次数:
cnt[s[j]]就是把s[j]对应的ASCII值作为cnt数组的下标,访问数组中对应的元素。比如s[j]是'a'(ASCII=97),cnt[s[j]]等价于cnt[97],这个位置专门用来统计字符'a'的出现次数。cnt[s[j]]++则是将该位置的计数加1:第一次遇到某个字符时,对应位置的计数从0变为1;后续再遇到同一个字符时,计数已经不为0,就会触发代码里的else分支,跳出内层循环(因为当前子串出现了重复字符)。
结合代码的执行流程举例
以输入字符串"abcabcbb"为例:
- 当外层循环
i=0时,内层循环j从0开始:j=0,s[j]='a'(ASCII=97),此时cnt[97]=0,执行cnt[97]++(变为1),len=1;j=1,s[j]='b'(ASCII=98),cnt[98]=0,执行cnt[98]++(变为1),len=2;j=2,s[j]='c'(ASCII=99),cnt[99]=0,执行cnt[99]++(变为1),len=3;j=3,s[j]='a',此时cnt[97]=1,触发else分支,跳出内层循环,当前len=3,max更新为3。
注意:这个解法存在bug——
cnt数组没有在每次外层循环后重置为0,后续外层循环(比如i=1)时,之前统计的字符计数还存在,会导致错误判断。正确的做法是在每次外层循环开始时,将cnt数组重新初始化为全0。
内容的提问来源于stack exchange,提问作者user23
相关产品推荐
相关产品推荐

