1790. 仅执行一次字符串交换能否使两个字符串相等
题目描述
给你长度相等的两个字符串 s1
和 s2
。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true
;否则,返回 false
。
示例 1:
输入:s1 = "bank", s2 = "kanb"
输出:true
解释:例如,交换 s2 中的第一个和最后一个字符可以得到 "bank"
示例 2:
输入:s1 = "attack", s2 = "defend"
输出:false
解释:一次字符串交换无法使两个字符串相等
示例 3:
输入:s1 = "kelb", s2 = "kelb"
输出:true
解释:两个字符串已经相等,所以不需要进行字符串交换
示例 4:
输入:s1 = "abcd", s2 = "dcba"
输出:false
提示
1 <= s1.length, s2.length <= 100
s1.length == s2.length
s1
和s2
仅由小写英文字母组成
解决方案
方法一:哈希表 + 计数
思路:
先用哈希表统计字符串
s1
与s2
的词频,只有词频相同的情况下,才可能满足题目要求的交换一次便得到相同字符串。计数:遍历,对两个字符串逐个判断,得到不同字符数量
cnt
。- 若
s1[i] != s2[i]
,cnt += 1
- 若
最终,当
cnt == 0
或cnt == 2
,分别对应着交换次数为0和交换次数为1的情况。(前提是两字符串词频相同)
该方法缺点在于空间复杂度为O(n)
Python3
|
|
java
|
|
方法二:纯计数
思路:
仍然是同时遍历两字符串 s1
与 s2
,用 cnt
统计相同下标不同字符的数量。
但不采用哈希表统计词频,而是用两个变量 c1
与 c2
记录上一次相同下标的情况下 s1
与 s2
不相同的字符。
若 cnt == 2
时,当前 s1[i] != c2
或 s2[i] != c1
,此时可能出现如下情况
bank
与canb
,隐含的意思就是两字符串词频不同,只不过这个方法咱们没有用哈希表进行统计。因为题目中说只可交换一次,所以只需判断
cnt == 2
这种情况下词频是否相同。
最终遍历完成之后,还需要判断 cnt 是否等于 1,防止出现如下情况
bank
与cank
,只有一个下标的字符不相同,隐含意思是词频不相同,无法交换。
Python3
|
|
Java
|
|
Encouragement
目前就读于新加坡国立大学,转码菜鸡一枚。
决心通过日更一篇题解激励自己坚持刷题,坚持学习算法。
这是我搭建Leetcode-Everyday仓库后发布の第19篇题解,欢迎各位star并提出Issue~
点击这里,进入我的个人Leetcode主页~