给定两个由小写字母构成的字符串 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
题解
- 两个字符串长度不相等不符合亲密字符串
- 两个字符串全等,且没有重复字符则不符合亲密字符串
- 遍历字符串找出2个不同位置交换,不全等则不符合亲密字符串
/**
* @param {string} s
* @param {string} goal
* @return {boolean}
*/
var buddyStrings = function(s, goal) {
if (s.length !== goal.length) {
return false
}
if (s === goal) {
const map = {}
for (let i = 0; i < s.length; i++) {
if (!map[s[i]]) {
map[s[i]] = true
} else {
return true
}
}
return false
}
let index
for (let i = 0; i < s.length; i++) {
if (s[i] !== goal[i]) {
if (index === undefined) {
index = i
} else {
const arr = s.split('')
const str = arr[i]
arr[i] = arr[index]
arr[index] = str
return arr.join('') === goal
}
}
}
return false
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/buddy-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。