[路飞] 19——leetcode - [859] 亲密字符串

162 阅读1分钟

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