亲密字符串 |刷题打卡

153 阅读1分钟

题目

给定两个由小写字母构成的字符串 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",此时 AB 相等。

示例2

输入: A = "ab", B = "ab"
输出: false
解释: 你只能交换 A[0] = 'a' 和 A[1] = 'b' 生成 "ba",此时 AB 不相等。

示例3

输入: A = "aa", B = "aa"
输出: true
解释: 你可以交换 A[0] = 'a' 和 A[1] = 'a' 生成 "aa",此时 AB 相等。

示例4

输入: A = "aaaaaaabc", B = "aaaaaaacb"
输出: true

示例5

输入: A = "", B = "aa"
输出: false

提示

  1. 0 <= A.length <= 20000
  2. 0 <= B.length <= 20000
  3. A 和 B 仅由小写字母构成。

思考

我们在仔细查看示例之后有几种特殊情况

  1. 字符串长度不一致,肯定为false
  2. 字符串完全相等情况下,如果出现重复字符,那肯定为true,不然就为false
  3. 剩余字符串我们只能有两位字符串不一致,如果不是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 春招闯关活动」, 点击查看 活动详情