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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:21:08