LeetCode刷题,亲密字符串(859)

164 阅读2分钟

亲密字符串

给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false 。

解题代码

思路:

  1. 首先找到a字符串第一个和前面字符不同的位置,然后再找到b字符串第一个不同的位置
  2. 然后继续找a第二个不同的字符,和b第二个不同的字符,最后比较 a 第一个是否相等于b第二个,a第二个是否相等b第一个。
  3. 最后再判断ab第二个不同字符位置后的字符是否全部相同,如相同则是亲密字符串。
  4. 还有一个特例,就是aabc & aabc 这种有重复字符数时且其他位置完全相同,此时交换aa所在下标也同样是亲密字符串
var buddyStrings = function(a, b) {
  if (a.length !== b.length) return false;
  if (a === b) return a.length > new Set(b).size; // 判断特例,set 去重,如果去重后的字符串长度小于未去重长度的话,说明该字符串有重复元素。
  let i = 0;
  let j = 0;
  while (a[i] === b[i]) ++i; // 找到第一个不同字符位置的下标
  j = i + 1; // 从找到的第一个位置后,继续查询第二个不同位置下标
  while (j < a.length && a[j] === b[j]) ++j;
  if (j === a.length) return false; // 如果j的下标等于字符串的长度,说明后面的字符全部相等,此时没有第二个可以交换的位置,则不是亲密字符串。
  if (a[i] !== b[j] || a[j] !== b[i]) return false; // 如果交叉的字符串不相等,说明交换后依然不是亲密字符串。
  j += 1; // 当代码走到一行时,说明交叉的位置相等可以交换,那么就需要判断当前位置后面的字符是不是全部相等
  while (j < a.length) {
    if (a[j] !== b[j]) return false;
    j += 1;
  }
  return true; // 此时代表后面的字符串全部相等。是亲密字符串。
};