题目介绍
给你两个字符串 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
输入:s = "ab", goal = "ab"
输出:false
解释:你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 不相等。
示例3
输入:s = "aa", goal = "aa"
输出:true
解释:你可以交换 s[0] = 'a' 和 s[1] = 'a' 生成 "aa",此时 s 和 goal 相等。、
示例4
输入: s = "aaaaaaabc", goal = "aaaaaaacb"
输出: true
提示:
1 <= s.length, goal.length <= 2 * 10^4s和goal由小写英文字母组成 leetcode-859 亲密字符串
b站视频
解题思路
我们分成5种情况来分析这道题目
1.两个字符串的长度不一致,肯定不是亲密字符串
2.两个字符串完全一致,但是没有任何一个字母重复,无法交换,也不是亲密字符串
3.两个字符串存在两个位置的字母不一致,并且无法交换两个位置之间的字母,不是亲密字符串
4.两个字符串存在两个以上的位置字母不一致,不是亲密字符串
5.两个字符串有且只有两个位置的字母不一致,并且这两个字母交换位置之后,能够使两个字符串相等,亲密字符串
解题代码
var buddyStrings = function(s, goal) {
// 如果字符串长度不相等,不是亲密字符串
if (s.length !== goal.length) return false
if (s === goal) {
// 字符串长度相等时,如果不含有至少两个相同的字母,不是亲密字符串
if ([...new Set(s.split(''))].length < goal.length) return true
return false
}
let i = 0, j = 0
const s1 = s.split(''), goal1 = goal.split('')
// 比较相同位置的字母,记录第1个不相同的位置
while (s1[i] === goal1[i]) {
i++
}
j = i + 1
// 比较相同位置的字母,记录第2个不相同的位置
while (j < s1.length && s1[j] === goal1[j]) {
j++
}
// 如果没找到第2个不相同的字母,不是亲密字符串
if (j === s1.length) return false
// 如果两个不相同的字母无法交换,不是亲密字符串
if (s1[i] !== goal1[j] || s1[j] !== goal1[i]) return false
j = j + 1
// 继续比较剩下的字母,如果出现不同字母的位置,则不是亲密字符串
while (j < s1.length && s1[j] === goal1[j]) {
j++
}
return j === s1.length
};
以上就是本题的解题思路,欢迎查看我的其他文章
[路飞]_环形链表
[路飞]_环形链表II
[路飞]_快乐数
[路飞]_反转链表
[路飞]_反转链表II
[路飞]_K 个一组翻转链表
[路飞]_旋转链表
[路飞]_两两交换链表中的节点
[路飞]_最近的请求次数
[路飞]_第 k 个数