[路飞]_亲密字符串

204 阅读3分钟

题目介绍

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

交换字母的定义是:取两个下标 ij (下标从 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

提示:

解题思路

我们分成5种情况来分析这道题目

1.两个字符串的长度不一致,肯定不是亲密字符串
2.两个字符串完全一致,但是没有任何一个字母重复,无法交换,也不是亲密字符串
3.两个字符串存在两个位置的字母不一致,并且无法交换两个位置之间的字母,不是亲密字符串
4.两个字符串存在两个以上的位置字母不一致,不是亲密字符串
5.两个字符串有且只有两个位置的字母不一致,并且这两个字母交换位置之后,能够使两个字符串相等,亲密字符串

2.gif

解题代码

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 个数