「每日LeetCode」2022年10月11日

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

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

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

Category Difficulty Likes Dislikes
algorithms Easy (54.26%) 55 -

Tags
Companies
给你长度相等的两个字符串 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 仅由小写英文字母组成

Discussion | Solution

思路

map 判断元素及数量是否都相等

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
* @lc app=leetcode.cn id=1790 lang=javascript
*
* [1790] 仅执行一次字符串交换能否使两个字符串相等
*/

// @lc code=start
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var areAlmostEqual = function (s1, s2) {
const map1 = {},
map2 = {};
let count = 0;

for (let i = 0; i < s1.length; i++) {
const char1 = s1[i],
char2 = s2[i];
if (char1 !== char2) count++;
if (count > 2) return false;
if (map1[char1]) map1[char1]++;
else map1[char1] = 1;
if (map2[char2]) map2[char2]++;
else map2[char2] = 1;
}
const arr1 = Object.entries(map1).sort((a, b) => (a[0] > b[0] ? 1 : -1)),
arr2 = Object.entries(map2).sort((a, b) => (a[0] > b[0] ? 1 : -1));

for (let i = 0; i < arr1.length; i++) {
const [char1, count1] = arr1[i],
[char2, count2] = arr2[i];
if (!(char1 === char2 && count1 === count2)) return false;
}
return true;
};
// @lc code=end