[路飞]亲密字符串

149 阅读2分钟

题目描述

给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。

交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。

例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。

分析

输入:两个字符串(sgoal),用于判断是否符合亲密条件
输出:boolean,判断的结果

解题思路

根据题目,如果是亲密字符串,需要符合交换 s 字符串的两个字符位置之后让它与 goal 相等。
那么首先要判断的是 s长度等于 goal,如果长度都不等于,不可能符合要求,直接返回 false。 然后再去找交换字符后是否符合要求。

然后我们要判断的是两种情况:

  1. s === goal

题目并没有说要交换两个不同的字符,所以这种情况单拎出来做判断,我们可以这么操作,如果是两个相等的字符串符合条件,也就是存在交换某两个字符还是想等字符串的情况,那么 s 一定存在相等的字符,供我们交换,我们可以对其中一个字符串去重,看长度是否不一样,从而得出是否存在重复元素的目的

  1. s !== goal

首先我们肯定要遍历字符串啊,找到不相等的字符。如果是交换后就相等的两个字符,我们可以在遍历的时候对于不想等的部分,用两个变量分别存储 sgoal 的字符,前者用倒叙插入,后边直接 +=,最后看他们是否相等且长度为 2,就可以得到结论~

代码

/**
 * @param {string} s
 * @param {string} goal
 * @return {boolean}
 */
var buddyStrings = function (s, goal) {
  if (s.length !== goal.length) return false

  // has at least one char that appears twice
  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]) {
      a = s[i] + a
      b += goal[i]
    }
  }

  return a.length === 2 && a === b
}