目录
问题描述
给定两个字符串 s
和 t
,我们需要编写一个函数来判断 t
是否是 s
的字母异位词。字母异位词指的是两个字符串包含相同的字符,并且每个字符出现的次数也相同。
示例
- 输入:
s = "anagram"
,t = "nagaram"
,输出:true
- 输入:
s = "rat"
,t = "car"
,输出:false
题目要求
- 输入的字符串长度在
1
到5 * 10^4
之间。 - 字符串
s
和t
仅包含小写字母。
解决方案
算法思路
为了解决这个问题,我们可以采用以下步骤:
- 长度比较:首先,如果两个字符串的长度不同,那么它们不可能是字母异位词。
- 字符计数:对于相同长度的字符串,我们可以统计每个字符串中每个字符出现的次数。
- 比较字符计数:如果两个字符串的字符计数完全相同,那么它们就是字母异位词。
过题图片
代码实现
java
import java.util.Arrays;
class Solution {
public boolean isAnagram(String s, String t) {
// 如果两个字符串都为空,它们是字母异位词
if (s.isEmpty() && t.isEmpty()) {
return true;
}
// 如果长度不同,它们不可能是字母异位词
if (s.length() != t.length()) {
return false;
}
// 将字符串转换为字符数组
char[] sArray = s.toCharArray();
char[] tArray = t.toCharArray();
// 对两个字符数组进行排序
Arrays.sort(sArray);
Arrays.sort(tArray);
// 比较排序后的数组是否相等
return Arrays.equals(sArray, tArray);
}
}
算法分析
- 时间复杂度 :排序操作的时间复杂度为
O(n log n)
,其中n
是字符串的长度。 - 空间复杂度 :
O(n)
,用于存储两个字符串的字符数组。
优化思路
虽然排序的方法简单直观,但在某些情况下可能不是最优解。我们可以通过使用哈希表来统计每个字符的出现次数,这样可以将时间复杂度降低到 O(n)
。
优化后的代码实现
java
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int[] count = new int[26]; // 小写字母共有26个
for (int i = 0; i < s.length(); i++) {
count[s.charAt(i) - 'a']++;
count[t.charAt(i) - 'a']--;
}
// 检查计数器是否都为0
for (int i : count) {
if (i != 0) {
return false;
}
}
return true;
}
}
优化后的算法分析
- 时间复杂度 :
O(n)
,其中n
是字符串的长度。 - 空间复杂度 :
O(1)
,因为我们只使用了一个固定大小的数组来存储字符计数。
排序方法
- 优点:实现简单,直观。
- 缺点 :时间复杂度较高,为
O(n log n)
,其中n
是字符串的长度。 - 适用场景:当字符串较短或者对时间复杂度要求不高时,可以使用这种方法。
哈希表计数方法
- 优点 :时间复杂度低,为
O(n)
,适用于较长的字符串。 - 缺点:需要额外的空间来存储字符计数。
- 适用场景:当处理较长的字符串或者对性能要求较高时,推荐使用这种方法。
题目链接
通过这种方式,我们能够更高效地判断两个字符串是否为字母异位词。
总结
对于字母异位词的问题,我们可以根据实际情况选择不同的算法。如果对性能有较高要求,推荐使用哈希表计数方法,因为它的时间复杂度更低。如果字符串较短,或者实现的简便性更重要,排序方法也是一个不错的选择。