859. 亲密字符串
题目
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
思路
只有两种情况才把这两个祖父从判定为亲密字符串。
- 只有2处不同,并且两处不同是可以交换的。如ab和ba
- s和goal完全相同,并且至少有一个字符有重复出现
算法
/*
* @lc app=leetcode.cn id=859 lang=javascript
*
* [859] 亲密字符串
*/
// @lc code=start
/**
* @param {string} s
* @param {string} goal
* @return {boolean}
*/
var buddyStrings = function(s, goal) {
if (s.length !== goal.length) return false;
if (s === goal) {
return s.length > new Set(goal).size; // 去重
}
let a = '';
let b = '';
for (let i = 0; i < s.length; i++) {
if (s[i] !== goal[i]) { // 寻址s和goal中不同字符的位置
a = s[i] + a; // 让不同的字符互相交换,继续找下一处不同的位置
b += goal[i];
}
}
return a.length === 2 && a === b;
};
// @lc code=end