一日一练:亲密字符串

101 阅读1分钟

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

s更换两个字母的位置与goal相等,存在两种情况可以为true

    1. sgoal相等,存在相同的字符 >= 2,这样任意交互其中两个就可以
    1. sgoal不相等,这个时候需要存在两个位置,这两个位置交互之后他们相等

其他情况都应该是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]] 
}