Leetcode刷题:242.有效的字母异位词
题目内容
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2
输入: s = “rat”, t = “car”
输出: false
解题思路
这里借鉴了代码随想录的方法:
用hash[26]这样的全0数组,s字符串中出现的字母在hash[26]对应位置中+1,t字符串中出现的字母在hash[26]对应位置-1
详细分析
我们为什么要用一个hash[26]的数组,因为可以跟26个字母进行对应:
字母 | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
hash中下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
hash的值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
我们只需要将字符串中每个字母跟a来做相对减法就能得到对应字母的下标了
分析示例1
输入: s = “anagram”, t = “nagaram”
输出: true
我们遍历s字符串,第一个字母为a,那么用此时a的Ascall码减去字母a的Ascall码,就等于0,那么hash[0]可以对应到字母a的位置,hash的值可以+1,以此类推,遍历完s字符串可以得到hash数组为:
字母 | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
hash中下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
hash的值 | 3 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
#对应代码为
for s in s:
hash[ord(s) - ord('a')]+=1
补充知识
ord()函数:可以将字符转化为你所需要的ASCII码。
chr()函数:可以将0-255中的任一整数转化为你所需要的字符。
而后我们遍历t字符串,第一个字母为n,那么用此时n的Ascall码减去字母a的Ascall码,就等于13,那么hash[13]可以对应到字母a的位置,hash的值可以-1,以此类推,遍历完s字符串可以得到hash数组为:
字母 | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
hash中下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
hash的值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
#对应代码为
for t in t:
hash[ord(t) - ord('a')]-=1
最后只需要判断hash数组中是不是所有数都为0,如果有不为0的数那么返回False,如果都为0则返回True
完整代码
#对应代码为
hash=[0 for i in range(26)]
for s in s:
hash[ord(s) - ord('a')]+=1
for t in t:
hash[ord(t) - ord('a')]-=1
for j in hash:
if j>0 or j<0:
return False
break
else:
return True