持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
前言
今天的题目为简单,认真阅读题目和例子就会发现题目非常的简单,通过简单的模拟每一种情况就可以解决。
每日一题
今天的题目是 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 仅由小写英文字母组成
题解
模拟
本来以为题目中的能够交换的是字符串,后面才发现是某一个字符,字符的话,这道题目的难度就非常简单了。
因为只是交换某一个字符,所以按照题目的意思,我们能够交换的字符要嘛是不需要交换,也就是两个字符串相等,要嘛就是两个字符需要交换,也就是两个字符串只有两个位置是不相同的,根据上面这两种情况,能够简单的写成第一个用来判定的条件,就是两个字符串中不相同的位置只能够有 0 个或者是 2 个。
0 个的情况就是两个字符串相等,那肯定是满足题目的条件的,2 个的情况下,就需要去判断这两个数交换以后,能不能使得两个字符串变得相等,因为是固定 2 个 所以我们只需要定义两个变量来保存下标就好了,最后如果不同的位置为2,在来判断这两个下标的数是否交叉相等。
function areAlmostEqual(s1: string, s2: string): boolean {
let a = 0;
let a1 = -1;
let a2 = -1;
for(let i=0;i<s1.length;i++){
if(s1[i] != s2[i]) {
a++
if(a1 != -1) {
a2 = i
}else {
a1 = i
}
}
if(a>2) return false
}
if(a==0) return true
if(a==2) return s1[a1] == s2[a2] && s1[a2] == s2[a1]
if(a==1) return false
};