题目
给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是取两个下标 i 和 j (下标从 0 开始),只要 i!=j 就交换 A[i] 和 A[j] 处的字符。例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
示例1
输入: A = "ab", B = "ba"
输出: true
解释: 你可以交换 A[0] = 'a' 和 A[1] = 'b' 生成 "ba",此时 A 和 B 相等。
示例2
输入: A = "ab", B = "ab"
输出: false
解释: 你只能交换 A[0] = 'a' 和 A[1] = 'b' 生成 "ba",此时 A 和 B 不相等。
示例3
输入: A = "aa", B = "aa"
输出: true
解释: 你可以交换 A[0] = 'a' 和 A[1] = 'a' 生成 "aa",此时 A 和 B 相等。
示例4
输入: A = "aaaaaaabc", B = "aaaaaaacb"
输出: true
示例5
输入: A = "", B = "aa"
输出: false
提示
- 0 <= A.length <= 20000
- 0 <= B.length <= 20000
- A 和 B 仅由小写字母构成。
思考
我们在仔细查看示例之后有几种特殊情况
- 字符串长度不一致,肯定为false
- 字符串完全相等情况下,如果出现重复字符,那肯定为true,不然就为false
- 剩余字符串我们只能有两位字符串不一致,如果不是2位那肯定为false,将2位字符串反转对比,如果一致为true,不然就为false。
解题
/**
* @param {string} a
* @param {string} b
* @return {boolean}
*/
var buddyStrings = function(a, b) {
// 一. 两字符串长度不等, 直接返回false
if(a.length !== b.length) return false;
// 二. 两字符串相等, 有重复字符的返回true, 因为他们可以和重复的交换
if(a === b) {
return a.length > new Set(b).size
}
// 三. 字符串不相等, 记录同一位置不相等的字符, 看最后长度是否为2 以及 在反转之后是否相等
let a = ''
let b = ''
for(let i = 0; i < A.length; i++){
if(A[i] !== B[i]){
a = A[i] + a // 注意这里 用来反转,如果使用数组的话,可以直接reserve()来做对比,但要小心改变愿数组了已经。
b += B[i]
}
}
return a.length === 2 && a === b
};
”本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情