[Array & String] 242. Valid Anagram 有效的字母异位词
Opened this issue · 0 comments
jotoy commented
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-anagram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本题只需要判断字符串s和t中每个字母出现次数是否相同。
如果两个字符串长度不同,则一定不为字母异位词,因此可以直接排除。对于相同长度的字符串,可以利用哈希表实现字符的比对。初始化长度为26值为0的数组,如果字符串s中出现了字符'a',则将数组对应的下标+1,如果在字符串t中出现了相同的字符'a',则将对应的下标-1。最终通过数组中是否全为0判断两个字符串是否是字母异位词
开始的解法:
初始化1个长为26的数组,没有使用字典,时间复杂度高
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
dic = "abcdefghijklmnopqrstuvwxyz"
if len(s) != len(t):
return False
s_num = [0 for i in range(26)]
for i in range(len(s)):
for j in range(26):
if s[i] == dic[j]:
s_num[j] += 1
if t[i] == dic[j]:
s_num[j] -= 1
if s_num == [0 for i in range(26)]:
return True
else:
return False
升级解法:
定义两个空字典,用于记录出现的字符。优势:由于存在一定可能,字符串中不会出现所有的26个字母,因此使用空字典可以降低空间复杂度。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if len(s) != len(t):
return False
dict1 = {}
dict2 = {}
for ch in s:
dict1[ch] = dict1.get(ch, 0) + 1
# dict2[ch] = 0
for ch in t:
dict2[ch] = dict2.get(ch, 0) + 1
# for ch in t:
# if dict1.get(ch,0) == 0:
# return False
# dict1[ch] = dict1.get(ch) - 1
# if dict1[ch]<0:
# return False
if dict1 == dict2:
return True
else:
return False
学到了:
- 利用哈希表(python中的字典)解决字符串匹配问题,相比直接使用字符串,可以提升效率,降低时间和空间复杂度。
- python中字典的get()函数:
dict.get(key, default=None)
返回指定键的值,如果值不在字典中返回default值