You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:25:48