仅执行一次字符串交换能否使两个字符串相等
给你长度相等的两个字符串 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
解题思路
根据题目要求,只有一个字符串执行执行最多一次字符交换使得两个字符串相等;那就说明两个字符串一共有两处不相同,我们只需要找出这两处的下标,并判断字符串交换位置后是否相等就行了
具体步骤如下:
- 第一步: 首先判断两个字符串是否相同;如果相同直接返回true
- 第二步: 初始化一个数组
diff
用来存放不相同字符的下标;开始遍历字符串
- 如果当前位置的元素不相同,就把下标存入数组,当数组的长度大于2时,就说明至少要交换两次,不符合要求,直接返回false
- 第三步: 判断diff长度,如果不等于2就说明不能交换或者一次无法交换成功
- 第四步:判断是字符串交换后是否相同,并返回结果
var areAlmostEqual = function(s1, s2) { if (s1 === s2) return true; const diff = []; for (let i = 0; i < s1.length; ++i) { if (s1[i] !== s2[i]) { diff.push(i); if (diff.length > 2) { return false; } } } if (diff.length !== 2) { return false; } return s1[diff[0]] === s2[diff[1]] && s1[diff[1]] === s2[diff[0]]; };