题目描述
这是 力扣上的 1790. 仅执行一次字符串交换能否使两个字符串相等 ,难度为 简单。
题目分析
题目要求明确,给定的两个字符串 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),我们只引入了常数级别的变量
今天就到这里,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~
。