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

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

题目描述

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

image.png

题目分析

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

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

简单题,咱们重拳出击

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


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

s1="abc",s2="dcd"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[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),我们只引入了常数级别的变量

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

欢迎点赞,关注,收藏

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

image.png

好了,本次就到这里

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

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

相关文章
|
2月前
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
21 0
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
|
9月前
|
算法
【每日挠头算法题(2)】压缩字符串|仅执行一次字符串交换能否使两个字符串相等
【每日挠头算法题(2)】压缩字符串|仅执行一次字符串交换能否使两个字符串相等
|
2月前
字符串,每个里面包含0-N个数字,如3,8,2,编写函数,将两个这样的字符串合并,并且输出的字符串里面没有重复的数字,并从大到小排列.
字符串,每个里面包含0-N个数字,如3,8,2,编写函数,将两个这样的字符串合并,并且输出的字符串里面没有重复的数字,并从大到小排列.
23 0
|
2月前
|
存储 索引 Python
leetcode-387:字符串中的第一个唯一字符(队列以及堆栈最简单的实现方式)
leetcode-387:字符串中的第一个唯一字符(队列以及堆栈最简单的实现方式)
36 1
|
2月前
|
存储 搜索推荐 Serverless
用指针和动态内存分配的方法输入10,2,30, 4,5,按输入顺序逆置排序,输出排序后的元素,即输出5,4,30,2,10
用指针和动态内存分配的方法输入10,2,30, 4,5,按输入顺序逆置排序,输出排序后的元素,即输出5,4,30,2,10
29 0
|
9月前
题目:下列给定程序中函数fun的功能是:从p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。
题目:下列给定程序中函数fun的功能是:从p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。
|
C++ 容器
【C++】字符串遍历的三种方式
【C++】字符串遍历的三种方式
交换字符串的顺序
当我们想要交换一个字符串的顺序,我们应该怎么做呢,例如“abcdefg”我们要转化为“gfedcba”,那我们来看看下面的代码
|
C语言
接受一个整型值,按照顺序打印他的每一位(函数,递归方法)
接受一个整型值,按照顺序打印他的每一位(函数,递归方法)
162 0
接受一个整型值,按照顺序打印他的每一位(函数,递归方法)
|
算法 索引
【Day28】力扣算法(超详细思路+注释) [1790. 仅执行一次字符串交换能否使两个字符串相等 ] [328. 奇偶链表 ][148. 排序链表]
了解(超详细思路+注释) [1790. 仅执行一次字符串交换能否使两个字符串相等 ] [328. 奇偶链表 ][148. 排序链表]。
94 0
【Day28】力扣算法(超详细思路+注释) [1790. 仅执行一次字符串交换能否使两个字符串相等 ] [328. 奇偶链表 ][148. 排序链表]