每日一题 -- 简单 -- 亲密字符串(859)

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

题目:

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

交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。

  • 例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。

示例 1:

输入:s = "ab", goal = "ba"
输出:true
解释:你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 相等。

🙇‍♂️ 感想:本题的需求是给我们两个字符串,然后字符串中随意调换两个位置使得两字符串完全相同。那只需要将其中一个字符串变动, 另一个字符串不需要变动。

🙇‍♂️ 解题思路:先将特殊情况排除掉。

  1. 如果字符串长度小于2直接返回false

2.如果两个字符串相同,则判断字符串中是否有字符存在两个以上相同的

3.定义两个变量,分别记录字符串不相等的位置下标,然后将两个位置对调,判断两个字符串是否相等,如果不相等直接返回false,相等返回true。

注意:字符串不能根据下标修改字符,只能重新拼接一个新的字符

function buddyStrings(s: string, goal: string): boolean {
  if (s.length < 2 || goal.length < 2) return false
  if (s === goal) {
    let obj = {}
    for (let i = 0; i < s.length; i++) {
      if (obj[i]) {
        return true
      } else {
        obj[i] = 1
      }
    }
    return false
  }
  let i = -1, j = -1, index = 0
  while (goal[index]) {
    if (s[index] !== goal[index])  {
      if (i === -1) {
        i = index
      } else {
        j = index
        let str = goal.substring(0, i) + goal[j] + goal.substring(i+1, j) + goal[i] + (goal.substring(j+1) || '')
        if (str === s) {
          return true
        } else {
          return false
        }
      }
    }
    index++
  }
  return false
};