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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:06:29