「每日LeetCode」2021年3月28日

本文最后更新于:2023年3月19日 晚上

Lt1790. 仅执行一次字符串交换能否使两个字符串相等

1790. 仅执行一次字符串交换能否使两个字符串相等

给你长度相等的两个字符串 s1s2 。一次**  字符串交换  操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
如果对 **其中一个字符串
执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false
示例 1:

1
2
3
输入:s1 = "bank", s2 = "kanb"
输出:true
解释:例如,交换 s2 中的第一个和最后一个字符可以得到 "bank"

示例 2:

1
2
3
输入:s1 = "attack", s2 = "defend"
输出:false
解释:一次字符串交换无法使两个字符串相等

示例 3:

1
2
3
输入:s1 = "kelb", s2 = "kelb"
输出:true
解释:两个字符串已经相等,所以不需要进行字符串交换

示例 4:

1
2
输入:s1 = "abcd", s2 = "dcba"
输出:false

提示:

  • 1 <= s1.length, s2.length <= 100
  • s1.length == s2.length
  • s1s2 仅由小写英文字母组成

思路

先剪枝,如果字符串相等直接返回 true,通过排序和转为 json 判断两个数组内元素是否完全一样,不一样的话直接返回 false。然后遍历字符串,统计两个字符串不同的位数,若刚好为 2,则可以通过一次交换得到两个一样的字符串。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var areAlmostEqual = function (s1, s2) {
if (s1 === s2) return true;
let arr1 = s1.split("").sort(),
arr2 = s2.split("").sort();
if (JSON.stringify(arr1) !== JSON.stringify(arr2)) return false;
let count = 0;
for (let i = 0; count <= 2 && i < s1.length; i++) {
if (s1[i] !== s2[i]) count++;
}
if (count === 2) return true;
return false;
};