
本文详解 Valid Anagram 问题中常见逻辑缺陷——早期 return true 导致误判,并提供两种正确实现(Arrays.equals() 和手动遍历),强调长度校验、逐位比较时机及边界处理。
本文详解 valid anagram 问题中常见逻辑缺陷——早期 `return true` 导致误判,并提供两种正确实现(`arrays.equals()` 和手动遍历),强调长度校验、逐位比较时机及边界处理。
在解决「Valid Anagram」问题时,核心思路是:若两字符串互为字母异位词,则它们经排序后应完全相同。你采用的字符数组排序方案方向正确,但关键逻辑存在严重缺陷——在首次字符相等时就立即返回 true,导致程序未完成全部比较便提前终止。
来看你原始代码的问题所在:
for (int i = 0; i <p>以示例 2(s = "rat", t = "car")为例: </p>
- 排序后 s_array = ['a', 'r', 't'],t_array = ['a', 'c', 'r'];
- i = 0 时 'a' == 'a' 成立 → 立即 return true,后续 'r' != 'c' 和 't' != 'r' 根本未被检查。
这正是输出错误 true 的根本原因。
✅ 正确做法是:仅当所有位置均匹配时才返回 true;一旦发现不匹配,立刻返回 false;若循环结束仍未返回,则说明全部匹配。 同时,必须先校验长度——长度不同直接为 false,避免数组越界或无效比较。
✅ 推荐解法一:使用 Arrays.equals()(简洁健壮)
import java.util.Arrays;
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
char[] sArr = s.toCharArray();
char[] tArr = t.toCharArray();
Arrays.sort(sArr);
Arrays.sort(tArr);
return Arrays.equals(sArr, tArr); // 自动处理 null、长度、逐元素比较
}
}
✅ 优势:内置方法已做完备校验(如 null 安全、长度一致判断、短路比较),代码简洁且不易出错。
✅ 推荐解法二:手动遍历(清晰展示逻辑)
import java.util.Arrays;
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
char[] sArr = s.toCharArray();
char[] tArr = t.toCharArray();
Arrays.sort(sArr);
Arrays.sort(tArr);
for (int i = 0; i <blockquote>
<p>⚠️ 注意事项:</p>
<ul>
<li>循环条件必须是 i </li>
<li>return true 必须置于循环<strong>之后</strong>,表示“全程无差异”;</li>
<li>长度校验是前提,不可省略——否则 "abc" 与 "ab" 排序后比较前三个字符会因 tArr 长度不足而抛 ArrayIndexOutOfBoundsException。</li>
</ul>
</blockquote><h3>总结</h3><p>判定 Anagram 的排序法本质是「标准化 + 全等校验」。你的逻辑漏洞不在排序本身,而在控制流设计:<strong>比较不是“找到一个相等就成立”,而是“找不到一个不等才算成立”</strong>。掌握这一思维转换,不仅能修复此题,更能规避类似 find first match 与 verify all match 的经典逻辑混淆。建议优先使用 Arrays.equals(),兼顾可读性与鲁棒性。</p>











