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)。- 循环里的逻辑:
if (dict[s[i]] > start):检查当前字符s[i]上一次出现的位置是否在当前子串的起始范围之内。如果是,说明这个字符在当前子串里重复了,得把start更新成这个字符上一次出现的索引,这样新的无重复子串就从start+1开始。dict[s[i]] = i;:把当前字符的最新出现位置更新为当前循环的索引i,方便后续遇到重复时快速查找。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
相关产品推荐
相关产品推荐

