# coding:utf-8
"""
Name : NO242.py
Author : qlb
Contect : 17801044486@163.com
Time : 2021/2/5 8:08
Desc: 有效字母异位词
"""
#解题思路
#有效字母异位词的条件有以下几个
#1 两个字符串长度相等 可以完全相同
#2 两个字符串B里面的每个字符都在A里面,排列顺序和A不同
#所以首先将A和B排序,如果A和B是有效字母异位词,那么将A和B排序之后,A和B是完全相同的,如果AB不是完全相同,则返回False
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if len(s) == len(t):
s = sorted(s)
t = sorted(t)
if s == t:
return True
else:
return False
else:
return False
test = Solution()
res = test.isAnagram("abcdfgh","abcdfgh")
print (res)
#解题思路2
#题目中说到字符只有小写字符 ,那么可以定义一个数组,来记录字符串s里面每个字符出现的次数,那么定义多大的数组呢
#由于只是小写字母 所以数组的长度为26
#如何把字符映射到数组上呢?因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为0,相应的字符z映射为下表25。
# 如何计算字母a的下标 ord('a') - ord('a') = 0 字符ss的下标为ord(ss) - ord('a')
# 对于字符串s来说 只要出现某个字符ss 那么该字符对应的位置计数值加1
# 对于字符串t来说 只要出现某个字符tt 那么该字符对应的位置计数值减1
# 如果s和t是有效的字母异位词 那么最后记录字符出现次数的数组所有值均为0
class Solution2:
def isAnagram(self, s: str, t: str) -> bool:
countArray = [0]*26
if len(s) == len(t):
for ss in s:
countArray[ord(ss) - ord('a')] += 1
for tt in t:
countArray[ord(tt) - ord('a')] -= 1
num_of_zero = countArray.count(0)
# num_of_zero = 0
# for n in countArray:
# if n == 0:
# num_of_zero += 1
if num_of_zero == 26:
return True
else:
return False
else:
return False