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
相关产品推荐
相关产品推荐

