1790. 仅执行一次字符串交换能否使两个字符串相等:简单模拟

161 阅读3分钟

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

题目描述

这是 力扣上的 1790. 仅执行一次字符串交换能否使两个字符串相等 ,难度为 简单

题目分析

题目要求明确,给定的两个字符串 s1 和 s2,要求我们最多执行一次字符串总字符的交换,能够让 s1 和 s2 相等

该题会很容易让我们去想这不就是遍历 s1 和 s2 ,记录一下出现字符不同的次数就可以了吗?如果出现不同的次数是 2 的话,那么就算是满足要求,如果是大于 2 或者为 1 的情况,那么就直接返回 false 就可以了

简单题,咱们重拳出击

可是实践之后,发现不是咱们的代码写的不够优雅,而是我们考虑问题不够全面,问题出在了咱们思考有漏洞

实际上经过实践,如果我们仅仅是简单的去记录次数的话,例如,咱们遇到这样的情况

s1="abc",s2="dcd"s1="abc", s2="dcd"

虽然 s1 和 s2 对应位置字符不同的个数有 2 个了,但是也不能满足我们的题目要求,因此,我们可以调整我们的思路,让其更加全面,再优化一下

我们可以将不同的这两次索引的索引记录下来,如果需要满足题目要求,那么交换俩字符串这俩索引上字符的值就可以了,加上这个条件就稳稳了

例如,这俩索引记录为 i 和 j,那么就有这个要求

s1[i]=s2[j]并且s1[j]=s2[i]s1[i] = s2[j] 并且 s1[j] = s2[i]

那么总结起来符合条件的情况就是有如下两种:

  • 一开始 s1 和 s2 本身就相等
  • s1 和 s2 不相等的字符个数有 2 个,且这两字符满足上述的条件

接下来,咱们就可以来实现编码了,咱们这次使用 golang 的方式来进行实现

Golang 的实现方式:

  • 一开始,初始化 i,j 都为 -1,咱们用 i 来记录第一个不相等的字符索引,用 j 记录第二个不相等字符的索引,如果有出现第三个不相等的字符,直接返回 false

  • 遍历完毕字符串之后,若 i 小于 零,表示 s1 和 s2 相等,返回 true

    • 若 j >= 0,说明已经有 2 个不相等的字符串了, 还必须满足 s1[i] == s2[j] && s1[j] == s2[i] 条件,才可返回 true
func areAlmostEqual(s1, s2 string) bool {
    i, j := -1, -1
    for idx := range s1 {
        if s1[idx] != s2[idx] {
            if i < 0 {
                i = idx
            } else if j < 0 {
                j = idx
            } else {
                return false
            }
        }
    }
    return i < 0 || j >= 0 && s1[i] == s2[j] && s1[j] == s2[i]
}

这种实现方式,咱们的时间复杂度为 O(n), n 为 s1 字符串的长度,空间复杂度为 O(1),我们只引入了常数级别的变量

今天就到这里,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~