LeetCode 242:我的有效字母异位词代码为何测试用例失败?
问题分析与修复方案
核心错误点
你的代码第三个循环逻辑完全错误:
- 你用
i遍历stringS.size()的范围,然后通过s.charAt(i)获取字符来检查哈希表,但stringS.size()是不同字符的数量,而s.charAt(i)是原字符串第i位的字符,两者没有对应关系。 - 以测试用例
s="ills"、t="dill"为例:stringS包含'i'、'l'、's'三个键,size为3,循环仅执行3次,取的是s[0]='i'、s[1]='l'、s[2]='l'——完全没遍历到stringS中的s键,自然不会检查t里是否存在s,导致错误返回true。
修复方案
正确的做法是直接遍历stringS的所有键,逐一和stringT对比:
- 先判断两个哈希表的size是否相等,不等直接返回false(异位词的不同字符数量必然一致);
- 遍历
stringS的每个键,检查stringT是否包含该键,且对应计数相等。
修复后的代码:
class Solution { public boolean isAnagram(String s, String t) { if(s.length() != t.length()){ return false; } HashMap<Character, Integer> stringS = new HashMap<>(); HashMap<Character, Integer> stringT = new HashMap<>(); for(int i = 0; i < s.length(); i++){ stringS.put(s.charAt(i), stringS.getOrDefault(s.charAt(i), 0) + 1); } for(int i = 0; i < t.length(); i++){ stringT.put(t.charAt(i), stringT.getOrDefault(t.charAt(i), 0) + 1); } // 先判断哈希表大小,提前排除不匹配情况 if (stringS.size() != stringT.size()) { return false; } // 遍历stringS的所有键进行对比 for (char c : stringS.keySet()) { if(!stringT.containsKey(c) || !stringT.get(c).equals(stringS.get(c))){ return false; } } return true; } }
额外优化思路
如果想进一步简化代码,可以只用一个哈希表:
- 先遍历
s,统计每个字符的计数(加1); - 再遍历
t,每个字符的计数减1; - 最后检查哈希表中所有值是否为0。
示例代码:
class Solution { public boolean isAnagram(String s, String t) { if(s.length() != t.length()){ return false; } HashMap<Character, Integer> countMap = new HashMap<>(); for(char c : s.toCharArray()){ countMap.put(c, countMap.getOrDefault(c, 0) + 1); } for(char c : t.toCharArray()){ countMap.put(c, countMap.getOrDefault(c, 0) - 1); // 提前终止:如果某个字符计数为负,说明t中该字符比s多 if(countMap.get(c) < 0){ return false; } } // 检查所有字符计数是否为0 for(int count : countMap.values()){ if(count != 0){ return false; } } return true; } }
内容的提问来源于stack exchange,提问作者egoldman
相关产品推荐
相关产品推荐

