题目:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = "anagram", t = "nagaram" 输出: true
示例 2: 输入: s = "rat", t = "car" 输出: false
说明: 你可以假设字符串只包含小写字母。
Python3代码解答:
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 创建计数器,创建了一个长度为26的列表record,这个列表用于记录每个字母在字符串s中出现的次数
# 然后再根据字符串t中的字母来减少计数
record = [0] *26
# 遍历字符串s中的每一个字符i,计算字符串中每个字母的出现次数
for i in s:
record[ord(i) - ord("a")] += 1
# 遍历字符串t中的每个字符
for i in t:
record[ord(i) - ord("a")] -= 1
# 检查计数器,如果所有计数都是0,说明s和t中每个字母出现的次数完全一致,它们互为字母异位词
for i in range(26):
if record[i] != 0:
return False
return True
上述代码解答:
上述代码是用来检查两个字符串s
和t
是否互为字母异位词的。所谓“字母异位词”,指的是两个字符串的字母相同,但是字母的排列顺序不同,比如说,"anagram" 和 "nagaram" 就是一对字母异位词。代码的详细实现过程如下:
-
创建计数器:首先,创建了一个长度为26的列表
record
,这个列表用于记录每个字母在字符串s
中出现的次数,然后再根据字符串t
中的字母来减少计数。这里之所以用长度为26的列表,是因为英文字母一共有26个,每个元素初始值设为0。 -
处理第一个字符串:遍历字符串
s
中的每一个字符i
,使用ord(i) - ord("a")
来计算每个字符相对于'a'的位置(ASCII码),然后在record
列表对应位置上的计数加1。这样,record
列表中的每个元素就表示了字符串s
中对应字母出现的次数。 -
处理第二个字符串:接着,遍历字符串
t
中的每个字符,并执行类似的操作,但这次是将record
列表对应位置上的计数减1,如果t
中的某个字符在s
中也存在,则它们的计数操作将互相抵消。 -
检查计数器:最后,遍历
record
列表,检查是否所有的计数都回到了0。如果所有计数都是0,说明s
和t
中每个字母出现的次数完全一致,则它们互为字母异位词,函数返回True
。如果有任何计数不为0,说明两个字符串在字母数量上不匹配,它们不是字母异位词,函数返回False
。
这里面比较难于理解的就是:record[ord(i) - ord("a")] += 1这句代码实现的功能,其具体的解释如下:
record[ord(i) - ord("a")] += 1
代码的主要作用是计算字符串中每个字母的出现次数,并且把这个次数记录下来。
用一个具体的例子来说明这个过程是如何工作的,假设我们正在处理字符串 "apple"
中的每个字母,并且当前字母是 'p'
。
-
理解
ord()
函数:首先,ord()
是一个Python内置函数,接受一个字符串(即一个字符)作为参数,并返回该字符的ASCII码(或Unicode码点)。例如,ord('a')
返回97,ord('b')
返回98,以此类推。 -
计算相对位置:当对当前字符
i
(假设为'p'
)执行ord(i)
时,得到'p'
的ASCII码,即112。然后,从这个值中减去'a'
的ASCII码(97),得到ord('p') - ord('a') = 112 - 97 = 15
,这个结果15,实际上是'p'
在字母表中的索引位置(从0开始计数)。 -
更新计数器:接下来,使用这个索引(15)来访问
record
列表中的相应位置,并将其值增加1。record[15] += 1
。这意味着正在记录'p'
字母在字符串中出现的次数,对于字符串"apple"
,当我们遍历到第一个'p'
时,record[15]
从0变为1,遍历到第二个'p'
时,再次执行record[15] += 1
,record[15]
就变成了2,准确地记录了'p'
字母出现了两次。
本文的对于力扣242. 有效的字母位词的Python3解答,仅仅是个人学习资料记录,也十分高兴我的见解可以帮助其他的正在做这个题目的同学,基础较差,仅仅是个人见解,大神勿喷,欢迎交流,谢谢!