给你两个字符串
s和goal,只要我们可以通过交换s中的两个字母得到与goal相等的结果,就返回true;否则返回false。
s更换两个字母的位置与goal相等,存在两种情况可以为true
-
s与goal相等,存在相同的字符>= 2,这样任意交互其中两个就可以
-
s与goal不相等,这个时候需要存在两个位置,这两个位置交互之后他们相等
其他情况都应该是false
function buddyStrings(s: string, goal: string): boolean {
// 如果s与goal长度不等,直接false
if (s.length !== goal.length) return false
let arr = []
const map = new Map()
for(let i = 0; i < s.length; i++) {
// 如果相同索引字母不一致,记录
if (s[i] !== goal[i]) {
arr.push(i)
}
// 记录s中字母出现的个数
map.set(s[i], (map.get(s[i]) || 0) + 1)
}
// 结果为true的第一种情况
if (arr.length === 0) {
return Array.from(map.values()).some(v => v >= 2)
} else if (arr.length !== 2) {
// 如果其他数量 相同索引位置字母不一致 就无法至少无法通过一次交换相等
return false
}
// 如果只有两个位置不相同,比较交换位置之后的字母是否相同
return s[arr[1]] === goal[arr[0]] && s[arr[0]] === goal[arr[1]]
}