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

