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

C++中vector版有效字母异位词代码为何可行而数组版本不行

LeetCode 242 有效字母异位词:vector与原生数组实现结果差异原因

两个版本的实现代码

// 可正确运行的vector版本
bool isAnagram1(string s, string t) {
        vector<int> countS(26,0), countT(26,0);
        
        for(char c : s){
            countS[c - 'a']++;
        }
        for(char c : t){
            countT[c - 'a']++;
        }
        
        return countS == countT;
    }

// 返回错误结果的原生数组版本
bool isAnagram2(string s, string t) {
        int countS[26], countT[26];
        
        for(char c : s){
            countS[c - 'a']++;
        }
        for(char c : t){
            countT[c - 'a']++;
        }
        
        return countS == countT;
       
    }

原生数组版本的两个核心错误

  • 未初始化局部数组,存在随机脏值
    vector版本调用构造函数时显式将26个元素全部初始化为0,计数从0开始累加结果准确。但栈上分配的局部原生数组如果不显式初始化,元素值是对应栈内存位置残留的随机值,并非0。此时遍历字符串做++操作是在随机值的基础上累加,统计出的字母频次从一开始就是错误的。
  • ==运算符比较的不是数组元素内容
    标准库为vector重载了==运算符,逻辑是先判断两个vector长度一致,再逐元素比较值,完全符合比较频次表的需求。但C++原生数组不支持直接用==比较内容:对两个数组名使用==时,数组名会隐式退化为指向首元素的指针,此时比较的是两个数组的首内存地址。countS和countT是两个独立分配的栈数组,首地址必然不同,因此无论数组内存储的内容是什么,这个判断永远返回false。

原生数组版本的正确写法

需要先对数组做零初始化,再逐元素比较计数结果:

bool isAnagram2_fixed(string s, string t) {
        //  = {0} 会将数组所有未显式赋值的元素初始化为0
        int countS[26] = {0}, countT[26] = {0};
        
        for(char c : s){
            countS[c - 'a']++;
        }
        for(char c : t){
            countT[c - 'a']++;
        }
        // 逐位对比26个字母的计数
        for(int i = 0; i < 26; i++){
            if(countS[i] != countT[i]) return false;
        }
        return true;
    }

内容的提问来源于stack exchange,提问作者user19140743

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:24:19