持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目提示
1 <= s1.length, s2.length <= 100s1.length == s2.lengths1和s2仅由小写英文字母组成
二、思路分析:
我们今天拿到本题是 leetcode 难度为简单题 1790. 仅执行一次字符串交换能否使两个字符串相等。本题要求对两个字符串进行比较,在一个字符串A中找到两个不同字符进行交换位置,可以得到另外一个字符串B,则结果返回True,否则其他情况返回False。两个字符串比较,会出现四种情况:
- 两个字符串,字符有不一样的如:"aa","ac"
- 两个字符串,字符位置移到次数大于1次如:"abc","cab"
- 两个字符串一样如:"aa","aa"
- 两个字符串,字符位置移到次数为1次如:"abc","acb"
根据题目内容,我们可以使用模拟计数的方式来进行求解,思路如下:
-
方法一:Counter方法应用
- 首先,当字符串s1与字符串s2相等时,则无需进行交换,即返回True
- 字符串s1与字符串s2字符不一样的情况,我们可以直接使用Counter()方法,将字符串s1与字符串s2里的每一个字符出现次数计算并返回一个字典类型,不相等则返回False
- 字符需要进行交换情况,需要遍历字符串,判断同一个索引位置s1[i]与s2[i]不相等,则临时变量t进行+1
- 直到遍历完所有字符串,当t==2时,则返回True否则返回False
class Solution(object): def areAlmostEqual(self, s1, s2): """ :type s1: str :type s2: str :rtype: bool """ if s1 == s2: return True if Counter(s1) != Counter(s2):return False t = 0 for i in range(len(s1)): if s1[i] != s2[i]: t +=1 return t == 2 -
方法二:双指针计数
- 除了借助方法外,我们可以使用双指针i,j分别记录字符串s1与s2字符不同的索引位置,初始化都为-1
- 遍历字符串s,同一索引位置idex的s1[idex]与s2[idex]
- 当s1[idex]与s2[idex]不相等时,i和j位置的字符要存在交换,交换时需要满足 s1[i] == s2[j] and s1[j] == s2[i]
- 当字符串中只存在一个不相同或者多个不同时,i,j都大于0则,不符合题目条件则直接返回False
class Solution(object): def areAlmostEqual(self, s1, s2): """ :type s1: str :type s2: str :rtype: bool """ i,j = -1,-1 for idex,(x,y) in enumerate(zip(s1,s2)): if x != y : if i < 0: i = idex elif j < 0: j = idex else: return False return i < 0 or j > 0 and s1[i]==s2[j] and s1[j]==s2[i]
三、总结:
本题是一道关于字符串查找的问题,在本题中需要分别找到字符串s1和字符串s2不同字符的位置,可以使用双指针来计数两个字符串不同字符,当存在同一个索引点有多个字符不一样直接返回False,AC提交记录如下:
- 时间复杂度:O(n),字符串s1或者字符串s2的长度
- 空间复杂度:O(1),使用记录两个字符位置
以上是本期内容,欢迎大佬们点赞评论,下期见~~~