有效的字母异位词
难度:
标签:
题目描述
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
代码结果
运行时间: 19 ms, 内存: 16.1 MB
// Java solution using Java Streams to check if two strings are anagrams
// Approach: Sort both strings and check if they are equal
import java.util.Arrays;
public class AnagramCheckerStream {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) return false;
return Arrays.stream(s.split("")).sorted().collect(Collectors.joining())
.equals(Arrays.stream(t.split("")).sorted().collect(Collectors.joining()));
}
public static void main(String[] args) {
AnagramCheckerStream checker = new AnagramCheckerStream();
System.out.println(checker.isAnagram("anagram", "nagaram")); // true
System.out.println(checker.isAnagram("rat", "car")); // false
}
}
解释
方法:
这个题解的思路是先对两个字符串 s 和 t 分别做去重排序,得到两个字符集合 lst1 和 lst2。如果两个集合长度不同,直接返回 False。然后遍历其中一个集合,比较每个字符在原字符串 s 和 t 中出现的次数,如果次数不同则返回 False,否则遍历结束后返回 True。
时间复杂度:
O(nlogn)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在检查是否为字母异位词时选择使用排序的方法?这种方法在什么情况下可能不是最优的?
▷🦆
在代码中使用了`sorted(set(s))`,去重后再排序,这是否真的必要?去重是否会影响判断字符串是否为字母异位词的准确性?
▷🦆
如果字符串`s`和`t`包含unicode字符,现有的方法是否仍然适用?如果不适用,应该如何修改算法来处理unicode字符?
▷🦆
在比较字符计数时,为什么选择遍历排序后的字符集合而不是原字符串?这样做有什么特别的优势吗?
▷相关问题
字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
找到字符串中所有字母异位词
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:
输入: s = "abab", p = "ab" 输出: [0,1,2] 解释: 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
提示:
1 <= s.length, p.length <= 3 * 104
s
和p
仅包含小写字母