C++中vector<int> help(257,-1)构造逻辑及最长子串代码参数解析
问题解答
首先直接给出结论:vector<int> help(257, -1); 不会创建257个每个包含-1个元素的vector,你对这个vector构造函数的参数逻辑理解有误。
该构造函数的实际含义
C++ 标准库中vector的两参数构造函数定义为vector(size_type count, const T& init_value),两个参数的作用分别是:
- 第一个入参:指定vector初始化后的总元素数量
- 第二个入参:指定vector中所有元素的初始填充值
对应到这行代码,实际创建的是1个长度为257的int型vector,其中257个元素的初始值全部为-1。
此处选择(257, -1)作为构造参数的原因
这个参数选择完全服务于无重复字符最长子串的滑动窗口实现逻辑:
- 选257作为长度:标准ASCII字符的编码取值范围是0~255,共256个可能值,开257长度的数组可以覆盖所有char类型的取值,直接用字符的ASCII值作为下标访问不会出现越界问题,多开1个位置也留足了冗余避免边界问题。
- 选-1作为初始值:字符串的合法下标都是从0开始的非负整数,-1不属于合法下标范围,可以直接作为「该字符尚未在当前滑动窗口中出现过」的标记值,和已经出现过的字符的位置记录做明确区分。
对应代码中的实际作用
你贴出的实现中,help是一个字符位置记录表,配合滑动窗口逻辑工作:
class Solution { public: int lengthOfLongestSubstring(string s) { vector<int> help(257, -1); int n = s.size(), ans = 0, curr = 0; for (int i = 0; i < n; i++) { // 如果当前字符的标记不是-1,说明在当前窗口内重复出现了 if (help[s[i]] != -1) { int temp = help[s[i]]; // 把所有移出窗口左边界的字符的标记重置为-1 for (int x = curr; x <= temp; x++) { help[s[x]] = -1; } // 更新滑动窗口左边界到重复位置的下一位 curr = temp+1; } // 记录当前字符的最新出现位置 help[s[i]] = i; // 更新最长无重复子串长度 ans = max(ans, i-curr+1); } return ans; } };
逻辑流程清晰:遍历字符串过程中,help[c]始终存储字符c在当前滑动窗口内的最新下标,遇到重复字符就收缩窗口左边界、清理移出窗口的字符标记,同时实时计算窗口长度更新最大值。
内容的提问来源于stack exchange,提问作者unknownguy
相关产品推荐
相关产品推荐

