力扣242. 有效的字母异位词

class Solution {
public:
    bool isAnagram(string s, string t) {
        int hash[26] = {0};
        for(int i = 0; i < s.size(); i++) {
            hash[s[i] - 'a']++;
        }
        for(int i = 0; i < t.size(); i++) {
            hash[t[i] - 'a']--;
        }
        int idx = 0;
        while(idx < 26) {
            if(hash[idx++]) return false;
        }
        return true;
    }
};
LeetCode 上,第 100 题是“相同的树”(Same Tree),而“字母异位词分组”是 LeetCode 第 49 题[^1]。因此,可能存在对题号的混淆。下面将分别讨论这两道题的相关解法和背景。 ### 1. LeetCode 第 49 题:字母异位词分组(Group Anagrams) **题目描述** 给定一个字符串数组,将所有字母异位词(anagram)组合在一起。字母异位词是指由相同字母不同顺序构成的字符串。 **解法思路** 解决该问题的核心思想是:**字母异位词在排序后具有相同的字符串形式**。因此,可以利用哈希表(Map)来将相同排序后的字符串作为键,对应的原始字符串列表作为值。 #### Java 解法示例(排序 + 哈希表) ```java class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String, List<String>> map = new HashMap<>(); for (String str : strs) { char[] arr = str.toCharArray(); Arrays.sort(arr); String key = new String(arr); List<String> list = map.getOrDefault(key, new ArrayList<>()); list.add(str); map.put(key, list); } return new ArrayList<>(map.values()); } } ``` #### Java 解法示例(计数 + 哈希表) 该方法适用于字符集较大的情况,例如 Unicode 字符。它基于字符出现的频率构建键值。 ```java public List<List<String>> groupAnagrams(String[] strs) { Map<String, List<String>> map = new HashMap<>(); for (String str : strs) { int[] count = new int[26]; for (char c : str.toCharArray()) { count[c - 'a']++; } StringBuilder key = new StringBuilder(); for (int i = 0; i < 26; i++) { key.append(count[i]).append('#'); } String keyStr = key.toString(); if (!map.containsKey(keyStr)) { map.put(keyStr, new ArrayList<>()); } map.get(keyStr).add(str); } return new ArrayList<>(map.values()); } ``` **时间复杂度分析** - 排序法:O(n * k log k),其中 `n` 是字符串数量,`k` 是字符串的最大长度。 - 计数法:O(n * k),其中 `k` 是字符串的平均长度,适用于较长字符串的情况。 **空间复杂度** - O(n * k),用于存储哈希表中的键值对。 ### 2. LeetCode 第 100 题:相同的树(Same Tree) **题目描述** 给定两棵二叉树,判断它们是否相同。两棵树相同当且仅当它们的结构相同,并且每个节点的值也相同。 **解法思路** 可以通过递归或迭代的方式比较两棵树的每个节点: - 如果当前节点都为空,则相同。 - 如果一个为空而另一个非空,则不相同。 - 如果节点值不同,则不相同。 - 否则递归比较左右子树。 #### Java 解法示例(递归) ```java public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) return true; if (p == null || q == null) return false; return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right); } ``` #### Java 解法示例(迭代,使用队列) ```java public boolean isSameTree(TreeNode p, TreeNode q) { Queue<TreeNode> queue = new LinkedList<>(); queue.offer(p); queue.offer(q); while (!queue.isEmpty()) { TreeNode node1 = queue.poll(); TreeNode node2 = queue.poll(); if (node1 == null && node2 == null) continue; if (node1 == null || node2 == null || node1.val != node2.val) return false; queue.offer(node1.left); queue.offer(node2.left); queue.offer(node1.right); queue.offer(node2.right); } return true; } ``` **时间复杂度** - O(n),其中 `n` 是树的节点数。 **空间复杂度** - 最坏情况下为 O(n),取决于树的高度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值