一 . 问题描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。
字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。
二 . 了解概念
哈希表(Hash Map)
-
定义:一种用于存储键值对(Key-Value)的数据结构,通过哈希函数将键映射到存储位置,从而实现高效的插入、删除和查找操作。
-
在本题中的作用:用于统计每个字符的出现次数。
-
常用操作:
-
put(key, value):插入或更新键值对。 -
get(key):获取键对应的值。 -
getOrDefault(key, defaultValue):获取键对应的值,如果键不存在则返回默认值。
-
三 . 解题思路
-
检查长度:首先检查两个字符串的长度是否相同,如果不同,直接返回
false,因为长度不同的字符串不可能是字母异位词。 -
统计字符频率:使用两个哈希表分别统计两个字符串中每个字符的出现频率。
-
比较哈希表:最后比较两个哈希表是否完全相同,如果是,则返回
true,否则返回false。
四 . 解题过程
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
Map<Character, Integer> mapS = getCharFrequency(s);
Map<Character, Integer> mapT = getCharFrequency(t);
return mapS.equals(mapT);
}
private static Map<Character, Integer> getCharFrequency(String str) {
Map<Character, Integer> map = new HashMap<>();
for (char c : str.toCharArray()) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
return map;
}
}
五 . 时间复杂度和空间复杂度
一 . 时间复杂度
-
统计字符频率:遍历字符串
s和t,时间复杂度为 O(n),其中 n 是字符串的长度。 -
比较哈希表:在最坏情况下,需要比较所有字符的频率,时间复杂度为 O(m),其中 m 是字符集的大小(例如小写字母是 26)。
-
总时间复杂度:O(n + m)。由于 m 通常是固定的(如 26),可以简化为 O(n)。
二 . 空间复杂度
-
哈希表存储:使用了两个哈希表来存储字符频率,每个哈希表最多存储 m 个键值对(m 是字符集大小)。
-
总空间复杂度:O(m)。如果字符集是固定的(如小写字母),可以认为是 O(1)。
六 . 自我反思(优化建议)
-
使用数组代替哈希表:
-
如果字符串只包含小写字母(或其他固定范围的字符),可以用一个长度为 26 的数组来统计字符频率。
-
这样可以减少哈希表的开销,同时数组的比较比哈希表的比较更快。
-
-
提前终止:
-
在统计
t的字符频率时,如果发现某个字符的计数变为负数,可以立即返回false,因为这意味着t中该字符的出现次数多于s。 -
这样可以提前终止不必要的计算。
-
-
排序法:
-
将两个字符串排序后直接比较是否相同。
-
时间复杂度:O(n log n)(排序的复杂度)。
-
空间复杂度:O(n)(需要额外的空间存储排序后的字符串)。
-
219

被折叠的 条评论
为什么被折叠?



