开启掘金成长之旅!这是我参与「掘金日新计划 · 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 相等。
🙇♂️ 感想:本题的需求是给我们两个字符串,然后字符串中随意调换两个位置使得两字符串完全相同。那只需要将其中一个字符串变动, 另一个字符串不需要变动。
🙇♂️ 解题思路:先将特殊情况排除掉。
- 如果字符串长度小于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
};