给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
if(a.length !== b.length) return false;
// 如果 a = 'ab' b = 'ab'则不是亲密字符串
// a = 'aab' b = 'aab' 则是亲密字符串
// new Set(b) 给b字符串去重,查看去重之后两个字符串长度是否相等
// 去重之后相等,则证明原字符串没有重复的字母,则不是亲密字符串
// 去重之后不相等,则证明原字符串有重复紫米,则是亲密字符串
if(a === b) return !(a.length === new Set(b).size)
let left=0;
let right = a.length - 1;
// a,b 长度相等,而且 a!==b
while((a[left] === b[left] || a[right] === b[right]) && left < right){
if(a[left] === b[left]) left ++;
if(a[right] === b[right]) right --;
}
// 找出 a,b 左右第一次不相等的位置,需要交叉相等,否则不是亲密字符串
if(a[left] !== b[right] || a[right] !== b[left]) return false
// 剩余的部分应该相等
const suba = a.slice(left+1, right);
const subb = b.slice(left+1, right);
return suba === subb
};