目录

LC 1790. 仅执行一次字符串交换能否使两个字符串相等 (opens new window) (opens new window)

简单

# 问题描述

给你长度相等的两个字符串 s1s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。

如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 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
  • s1s2 仅由小写英文字母组成

# 遍历

要求最多执行一次交互,那么如果两个字符串满足要求,这两个字符串必然是完全相同或者有两个位置上字母不同且相互对称。可以对字符串进行一次遍历,遇到不一致的字符时,使用位数记录不同的字母,当不一致字符数为 00 或者不一致字符数为 22 且位数记录结果一致,则说明满足条件。

/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var areAlmostEqual = function (s1, s2) {
  const n = s1.length
  let mask1 = 0
  let mask2 = 0
  let cnt = 0
  for (let i = 0; i < n; i++) {
    if (s1[i] !== s2[i]) {
      cnt++
      mask1 |= 1 << (s1[i].charCodeAt(0) - 97)
      mask2 |= 1 << (s2[i].charCodeAt(0) - 97)
    }
  }
  return cnt === 0 || (cnt === 2 && mask1 === mask2)
}
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)
上次更新: 2023/01/31 19:48:05

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!