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

C++中用二维vector实现最长公共子串运行报错求助

解决Longest Common Substring实现中vector矩阵赋值的致命参数错误

我刚帮几个朋友排查过类似的问题,这种vector初始化或赋值时的"无效参数"致命错误,几乎都和内存边界越界或者非法尺寸初始化有关,咱们一步步拆解问题:


1. 先排查vector矩阵的初始化尺寸是否合法

错误提示的核心是"无效参数",大概率是你创建二维vector时传入了非正的尺寸值。比如:

  • 如果你的两个输入字符串是空串,或者计算长度时不小心写了s1.length()-1这类错误逻辑,会导致矩阵的行/列数为0甚至负数。
  • 正确的初始化应该是基于两个字符串的长度+1(DP算法需要预留第0行/列作为边界):
    // 假设s1和s2是输入的两个字符串
    vector<vector<int>> dp(s1.size() + 1, vector<int>(s2.size() + 1, 0));
    
    这里要确保s1.size()和s2.size()都是非负的(字符串长度本身不会为负,但如果输入处理出错比如空串,+1后尺寸为1,是合法的)。

2. 检查循环中的索引边界是否越界

最长公共子串的DP循环很容易踩索引的坑:

  • 错误示例:如果循环从i=0开始,然后访问dp[i-1][j-1],当i=0时会出现负索引,直接触发非法内存访问:
    // 错误写法!
    for (int i = 0; i < s1.size(); i++) {
        for (int j = 0; j < s2.size(); j++) {
            if (s1[i] == s2[j]) {
                dp[i][j] = dp[i-1][j-1] + 1; // i=0时i-1=-1,越界!
            }
        }
    }
    
  • 正确的循环逻辑应该从i=1到i<=s1.size(),对应字符串的i-1索引:
    for (int i = 1; i <= s1.size(); i++) {
        for (int j = 1; j <= s2.size(); j++) {
            if (s1[i-1] == s2[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
                // 这里顺便更新最长子串长度
            } else {
                dp[i][j] = 0; // 子串不连续,重置为0
            }
        }
    }
    

3. 避免中途修改vector尺寸导致迭代器失效

如果你的代码里有在循环中动态resize vector的操作,比如dp.resize(...),会导致之前的索引或迭代器失效,进而触发参数错误。最长公共子串的DP矩阵尺寸是固定的,一定要在循环前就初始化完成,不要中途调整尺寸。

4. 输入字符串的处理是否正确

如果是从标准输入读取字符串:

  • 用cin >> s1会截断空格,导致字符串不完整;
  • 如果之前用了cin读取其他数据,要先处理换行符再用getline(cin, s1),否则会读入空串。

完整的可运行示例代码

你可以参考这个实现来对比自己的代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int longestCommonSubstring(const string& s1, const string& s2) {
    int m = s1.size();
    int n = s2.size();
    // 初始化(m+1)x(n+1)的DP矩阵,所有元素初始为0
    vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
    int maxLength = 0;

    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (s1[i-1] == s2[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
                maxLength = max(maxLength, dp[i][j]);
            } else {
                dp[i][j] = 0;
            }
        }
    }
    return maxLength;
}

int main() {
    string s1, s2;
    cout << "输入第一个字符串:";
    getline(cin, s1);
    cout << "输入第二个字符串:";
    getline(cin, s2);

    int result = longestCommonSubstring(s1, s2);
    cout << "最长公共子串的长度:" << result << endl;

    return 0;
}

如果还是有问题,可以先打印s1.size()和s2.size()确认尺寸,再单独测试vector初始化的代码,看看矩阵的行/列数是否符合预期。

内容的提问来源于stack exchange,提问作者Sumeet Kumar Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:20:54