给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是取两个下标 i 和 j (下标从 0 开始),只要 i!=j 就交换 A[i] 和 A[j] 处的字符。例如,在 “abcd” 中交换下标 0 和下标 2 的元素可以生成 “cbad” 。

示例

示例 1:
输入: A = “ab”, B = “ba”
输出: true
解释: 你可以交换 A[0] = ‘a’ 和 A[1] = ‘b’ 生成 “ba”,此时 A 和 B 相等。

示例 2:

输入: A = “ab”, B = “ab”
输出: false
解释: 你只能交换 A[0] = ‘a’ 和 A[1] = ‘b’ 生成 “ba”,此时 A 和 B 不相等。

示例 3:

输入: A = “aa”, B = “aa”
输出: true
解释: 你可以交换 A[0] = ‘a’ 和 A[1] = ‘a’ 生成 “aa”,此时 A 和 B 相等。

示例 4:

输入: A = “aaaaaaabc”, B = “aaaaaaacb”
输出: true

示例 5:

输入: A = “”, B = “aa”
输出: false

题解

  1. 两个字符串长度不相等不符合亲密字符串
  2. 两个字符串全等,且没有重复字符则不符合亲密字符串
  3. 遍历字符串找出2个不同位置交换,不全等则不符合亲密字符串
  1. /**
  2. * @param {string} s
  3. * @param {string} goal
  4. * @return {boolean}
  5. */
  6. var buddyStrings = function(s, goal) {
  7. if (s.length !== goal.length) {
  8. return false
  9. }
  10. if (s === goal) {
  11. const map = {}
  12. for (let i = 0; i < s.length; i++) {
  13. if (!map[s[i]]) {
  14. map[s[i]] = true
  15. } else {
  16. return true
  17. }
  18. }
  19. return false
  20. }
  21. let index
  22. for (let i = 0; i < s.length; i++) {
  23. if (s[i] !== goal[i]) {
  24. if (index === undefined) {
  25. index = i
  26. } else {
  27. const arr = s.split('')
  28. const str = arr[i]
  29. arr[i] = arr[index]
  30. arr[index] = str
  31. return arr.join('') === goal
  32. }
  33. }
  34. }
  35. return false
  36. };

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/buddy-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。