1790. 仅执行一次字符串交换能否使两个字符串相等(模拟计数)

92 阅读1分钟

image.jpeg

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目提示

    • 1 <= s1.length, s2.length <= 100
    • s1.length == s2.length
    • s1 和 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提交记录如下:

image.png

  • 时间复杂度:O(n),字符串s1或者字符串s2的长度
  • 空间复杂度:O(1),使用记录两个字符位置

以上是本期内容,欢迎大佬们点赞评论,下期见~~~