Leetcode 2273代码报错:数组索引-97越界,请求排查问题
问题分析与修复方案
核心错误原因
数组访问越界导致负数索引
你用同一个j遍历words[i]和words[i-1],但如果两个单词长度不同(比如words[i]比words[i-1]长),当j超过words[i-1].size()时,words[i-1][j]会访问非法内存,得到的字符值随机,减97后可能变成负数,导致temp[check1]访问负数索引,触发越界错误。变位词判断逻辑完全错误
变位词要求字符种类和数量完全相同,与顺序无关,但你按相同位置的字符加减计数的逻辑,会把"abc"和"cba"这类合法变位词误判为非变位词,完全不符合题目要求。ans变量未循环重置ans只在函数开头初始化一次为true,如果某次判断出不是变位词,ans会被设为false,后续所有循环都会沿用这个错误值,导致真正的变位词也无法被删除。
修复后的代码
class Solution { public: vector<string> removeAnagrams(vector<string>& words) { int i = 1; while (i < words.size()) { // 长度不同直接排除变位词可能 if (words[i].size() != words[i-1].size()) { i++; continue; } int temp[26] = {0}; // 统计当前单词的字符出现次数 for (char c : words[i]) { temp[c - 'a']++; } // 减去前一个单词的字符出现次数 for (char c : words[i-1]) { temp[c - 'a']--; } bool isAnagram = true; for (int k = 0; k < 26; k++) { if (temp[k] != 0) { isAnagram = false; break; } } if (isAnagram) { words.erase(words.begin() + i); // 删除后不递增i,下一个元素会移到当前位置 } else { i++; } } return words; } };
修复要点说明
- 先校验长度:变位词长度必然相同,提前过滤可避免无效计算和越界风险。
- 正确统计字符:分别遍历两个单词统计字符计数,再对比计数差是否全为0,这是判断变位词的标准逻辑。
- 循环内重置判断变量:每次判断前重新初始化
isAnagram,避免之前的结果干扰当前判断。 - 用while循环简化逻辑:删除元素后无需手动调整索引,逻辑更直观清晰。
内容的提问来源于stack exchange,提问作者Its Me Pratham
相关产品推荐
相关产品推荐

