C++如何正确初始化vector<bool>二维矩阵修复运行时报错
问题根因
你写的vector<vector<bool>> dp(s.length());仅初始化了二维vector的第一维:外层vector共包含s.length()个元素,但每个元素都是默认构造的空vector<bool>,没有为第二维(列)分配任何内存空间。
这和Java的二维数组初始化逻辑不同:你写的Java代码boolean[][] dp = new boolean[s.length()][s.length()]会同时为行、列两维分配空间,所有元素默认初始化为false;但C中你只传了外层vector的长度参数,内层vector长度为0,后续执行dp[i][j] = ...时属于越界访问非法内存,才会触发你看到的空指针写入运行错误。
另外你代码里还有一处Java转C的常见API差异bug:C++的string::substr第二个参数是子串长度,不是结束下标,你原来写的s.substr(i, j+1)会在i不为0时截取错误长度的字符串,正确写法应该是s.substr(i, j - i + 1)。
正确初始化写法
要创建行数、列数均为s.length(),默认值全为false的二维bool矩阵,初始化时需要同时指定内层vector的构造参数,写法如下:
int n = s.length(); // 外层共n个元素,每个元素是长度为n、初始值为false的vector<bool> vector<vector<bool>> dp(n, vector<bool>(n, false));
如果担心vector<bool>的位特化实现带来的隐式坑(比如无法取普通引用、性能波动),写算法题时也可以直接用vector<vector<char>>替代,初始化逻辑完全一致,内存开销差异可以忽略。
修正后的完整可运行代码
class Solution { public: string longestPalindrome(string s) { string result = ""; int n = s.length(); vector<vector<bool>> dp(n, vector<bool>(n, false)); for (int i = n - 1; i >= 0; i--) { // j从i开始遍历即可,j<i的位置不存在有效子串,不需要计算 for (int j = i; j < n; j++) { dp[i][j] = s[i] == s[j] && (j - i < 3 || dp[i + 1][j - 1]); if (dp[i][j] && (result.empty() || j - i + 1 > result.length())) { result = s.substr(i, j - i + 1); } } } return result; } };
内容的提问来源于stack exchange,提问作者Saturnsbelt
相关产品推荐
相关产品推荐

