题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = "anagram", t = "nagaram" 输出: true
示例 2: 输入: s = "rat", t = "car" 输出: false
说明: 你可以假设字符串只包含小写字母。
代码示例
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 初始化长度为26的数组,用于记录字符出现次数
record = [0] * 26
# 遍历字符串s,更新字符出现次数
for char in s:
index = ord(char) - ord('a')
record[index] += 1
# 遍历字符串t,更新字符出现次数
for char in t:
index = ord(char) - ord('a')
record[index] -= 1
# 检查数组中是否还有非零元素,如果有则不是字母异位词
for count in record:
if count != 0:
return False
# 所有字符出现次数相等,是字母异位词
return True
# 示例代码
solution = Solution()
result = solution.isAnagram("anagram", "nagaram")
print(result) # 输出 True
一开始看到题目时,考虑到暴力解法,即遍历第一个字符串中的每一个字符,判断其是否在第二个字符串中出现过。这种方法是直观而简单的,但在效率上可能面临较大挑战,尤其当字符串长度较大时。
然而,通过阅读代码随想录后,我发现了一种更为巧妙的解法。作者利用了长度为26的数组 record,将字符串s中的每个字符 s[i] - 'a' 的值作为 record 数组的索引,然后将对应位置的元素加1。对于字符串t,则将相应位置的元素减1。最终,如果两个字符串是字母异位词,那么 record 数组的所有元素都应该为0。
这样的解法避免了对两个字符串进行排序或比较,大大提高了效率。通过巧妙地利用数组记录字符出现的次数,这个算法在时间和空间复杂度上都表现出较好的性能。
这次学习让我更深刻地理解了如何通过数组进行字符频次统计,提高了解决问题的灵活性和效率。在今后的算法学习中,我期待能够运用这样的巧妙思路解决更多有趣的问题。