一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 本题给两个参数字符串s和字符串t,且都是由小写字母组成
- 字符串s和字符串t的长度都在1~5*10000
二、思路分析:
我们拿到本题,读完题意后,该题与383. 赎金信题目类似。本题要求我们求出字符串s和字符串t中每一次字符出现的次数相同,即题目定义的有效字母异位词。
-
方法一:常规思路
-
那么解答该题,最容易想到的思路如下:
- 首先对字符串 s 和字符串 t 长度进行判断,当不相等时,则直接返回False
- 我们对字符串 s字符使用set()函数进行去重
- 使用for循环进行对set(s)进行遍历取出每一个字符i
- 先对取出的字符i判断是否在字符串t.如果不在,则直接返回False
- 借助Python底层函数count(),分别求出s.count(i)与t.count(i),不相等时则返回False
- 直到遍历完set(s),则返回True
根据上述思路,我们能快速解答本题,速度也是超过90%的用户:
class Solution(object):
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
if len(s) != len(t):
return False
for i in set(s):
if i not in t :
return False
if s.count(i) != t.count(i):
return False
return True
上述方法中,对于字符串中每一个字符出现次数,我们直接使用python底层函数count()来实现的。
那么,我们不使用count(),还有其他方式可以求出字符串字符出现的次数呢?
-
方法二:哈希表
-
方式一:定义一个初始化长度为26的列表,根据Ascii码值来求出列表的索引位置,字符出现的次数进行连续加减计数。(注:该方法在383. 赎金信已经实现了)
-
方式二:使用字典(哈希表),字符i作为字典的key值,字符出现的次数作为字典的value值
-
本题,来使用字典来实现一下,思路如下:
- 先使用for循环遍历字符串s,记录字符串s每一个字符出现的次数ss[s[i]] = ss[s[i]]+1
- 再使用for循环遍历字符串t,对字符j判断是否在ss.keys(),如果不在则返回False
- 如在ss.keys()中,ss[t[j]] = ss[t[j]]-1.当ss[t[j]]<0 时,则返回False
- 直到遍历完字符串t,返回True
class Solution(object):
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
if len(s) != len(t):
return False
ss = {}
for i in range(len(s)):
if s[i] in ss.keys():
ss[s[i]] = ss[s[i]] + 1
else:
ss[s[i]] = 1
print(ss)
for j in range(len(t)):
if t[j] in ss.keys():
ss[t[j]] = ss[t[j]] - 1
if ss[t[j]] < 0:
return False
else:
return False
return True
-
方法三:排序
-
解答本题,我们还可以换一个思路:
- 先对字符串s和字符串t进行排序sort()
- 然后进行比较字符串是否相等
return sorted(s)== sorted(t)
三、总结:
我们使用哈希表解答该题,AC记录如下:
时间复杂度O(n),n为字符串s长度 空间复杂度O(S),S为26个字符集长度
以上本期内容,欢迎大佬们点赞评论,下期见~~~