题目描述
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
分析
输入:两个字符串(s,goal),用于判断是否符合亲密条件
输出:boolean,判断的结果
解题思路
根据题目,如果是亲密字符串,需要符合交换 s 字符串的两个字符位置之后让它与 goal 相等。
那么首先要判断的是 s 的长度等于 goal,如果长度都不等于,不可能符合要求,直接返回 false。 然后再去找交换字符后是否符合要求。
然后我们要判断的是两种情况:
s===goal
题目并没有说要交换两个不同的字符,所以这种情况单拎出来做判断,我们可以这么操作,如果是两个相等的字符串符合条件,也就是存在交换某两个字符还是想等字符串的情况,那么 s 一定存在相等的字符,供我们交换,我们可以对其中一个字符串去重,看长度是否不一样,从而得出是否存在重复元素的目的
s!==goal
首先我们肯定要遍历字符串啊,找到不相等的字符。如果是交换后就相等的两个字符,我们可以在遍历的时候对于不想等的部分,用两个变量分别存储 s 和 goal 的字符,前者用倒叙插入,后边直接 +=,最后看他们是否相等且长度为 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
}