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

C++最长无重复子串代码中dict的作用及相关文档查询

最长无重复字符子串算法中dict的作用解析

一、dict的核心功能

这里的dict是个长度为256的vector<int>,初始值全设为-1,它的唯一作用就是记录每个ASCII字符最后一次出现的索引位置。因为ASCII字符总共只有256种(从0到255,覆盖大小写字母、数字、符号等所有常见字符),所以用256长度的数组刚好能装下所有字符的记录。

二、代码逐行拆解

先把代码清晰列出来:

int lengthOfLongestSubstring(string s) {
    vector<int> dict(256, -1);
    int maxLen = 0, start = -1;
    for (int i = 0; i != s.length(); i++) {
        if (dict[s[i]] > start)
            start = dict[s[i]];
        dict[s[i]] = i;
        maxLen = max(maxLen, i - start);
    }
    return maxLen;
}
  • vector<int> dict(256, -1);:初始化一个包含256个整数的数组,每个元素默认值是-1,意思是对应字符还没在字符串里出现过。
  • start变量:用来标记当前无重复子串的起始位置的前一个索引(初始设为-1,对应第一个字符的起始位置是0)。
  • 循环里的逻辑:
    1. if (dict[s[i]] > start):检查当前字符s[i]上一次出现的位置是否在当前子串的起始范围之内。如果是,说明这个字符在当前子串里重复了,得把start更新成这个字符上一次出现的索引,这样新的无重复子串就从start+1开始。
    2. dict[s[i]] = i;:把当前字符的最新出现位置更新为当前循环的索引i,方便后续遇到重复时快速查找。
    3. maxLen = max(maxLen, i - start);:计算当前无重复子串的长度(i - start),和之前记录的最长长度maxLen对比,留下较大的那个值。

举个实际例子:比如处理字符串"abcabcbb"

  • 当i=3时,字符是'a',此时dict['a']存的是0,而start是-1,0 > -1,所以start更新为0。接着把dict['a']改成3,当前子串长度是3-0=3,和之前的最长长度3持平,maxLen保持不变。
  • 后续每次遇到重复字符,都会通过dict快速找到上一次出现的位置,及时调整子串的起始点,保证当前子串始终没有重复字符。

三、C++相关文档的获取方式

  • 关于vector的用法:可以直接查看你使用的IDE内置文档(比如VS按F1、CLion右键选择查看文档),或者查阅C++标准库的中文/英文手册,重点看vector的构造函数(这里用的是vector(size_t n, const T& val),创建n个元素,每个初始化为val)。
  • 关于ASCII字符集:可以查计算机基础资料,了解ASCII的范围是0-255,所以用256长度的数组就能覆盖所有可能的字符。

内容的提问来源于stack exchange,提问作者Emmanuel Gil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:55:20