一、题目描述
这道题是一个条件判断题,很容易漏掉一些细节,是一道简单题,但是不简单。下图可以证明
提交次数那么多,但是通过率很低。
接这个图,也让大家能够很好的看题目描述,如果还想看更加详细的题目描述,请看leetcode地址
二、分析
- 当两个字符串相等时
- 当两个字符串不相等时 从这连个角度出发,看我的代码,应该就能看懂,毕竟注释很详细。
关键细节:
- 字符串相等,需要看26个小写英文字母里,是否有出现两次以上的字母, 有则是亲密字符串
- 字符串不相等的情况下,s与goal应该有且只有两个位置的字符是不一样的,并且交叉相等,才是亲密字符串
三、代码
/**
* @param {string} s
* @param {string} goal
* @return {boolean}
*/
const buddyStrings = function(s, goal) {
// 字符长度不相等
if(s.length !== goal.length) return false
if(s === goal) {
// 字符串相等,需要看26个小写英文字母里,是否有出现两次以上的字母
// 哈希表, 存对应字母出现的次数
const map = new Map()
// 遍历s字符串
for(const val of s) {
if(map.has(val)) {
// 如果哈希表里已经存在该字母,说明有出现两次以上的字母,返回true
return true
} else {
// 哈希表里没有,则往哈希表里添加
map.set(val, 1)
}
}
return false
} else {
// 字符串不相等的情况下,s与goal应该有且只有两个位置的字符是不一样的,才是亲密字符串
// 两个指针记录两个位置的字符串
let first = -1, second = -1
// 遍历s与goal,找不同的位置
for(let i in s) {
// 相同位置字符相同,跳出本次循环
if(s[i] === goal[i]) continue
// 代码到了这里说明 这个位置的字符不相同
if(first === -1) {
// 第一次不同位置存
first = i
} else if(second === -1) {
// 第二次不同位置存
second = i
} else {
// 说明出现了两次以上不同位置,就不是亲密字符串了
return false
}
}
// 到了这里说明只有两个位置的字符是不同的, 在判断交叉是否相等
return s[first] === goal[second] && s[second] === goal[first]
}
};