亲密字符串&&疑是做题网站的BUG

73 阅读2分钟

亲密字符串

要求

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

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

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

1.png

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bu… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

首先有几种情况

  • 两字符串长度不等,直接返回false

  • 两字符串长度相等,举例:['ab','ab']、['aa','aa']、['aaaabc','aaaacb']

    当两字符串相同时['ab','ab']、['aa','aa'],进行去重,当去重后的长度小于去重前的长度,返回true

    去重前后长度一致的话,把两字符串不相同的字节找出来,判断长度是否为2,判断反转后是否相同

有趣的例子

但是在这里有个很有趣的例子['aaaab','aaaab']

这两个字符串应该是返回false的,它们不是亲密字符串

但是在力扣上会返回true

1640009947(1)(1).png

代码

 var buddyStrings = function (s, goal) {
    // 当字符串长度不一样时
    if (s.length != goal.length) return false;
    // 当字符串相同时(长度肯定一样)
    if (s === goal) {
        // 会有三种情况:['aa','aa'],['ab','ab'],['aaab','aaab']
        // 第一第二种情况返回true、false
        // 第三种情况应该返回false才对,但是很不幸的是,我的代码与力扣的代码都返回了true
        // 我想这个一个BUG,已经反馈给力扣了,如果有后续,我会更新这篇文章告诉大家
        return s.length > new Set(goal).size;
    }
    // 记录两个字符串不同的地方
    let S = '',
        GOAL = ''
    for (let i = 0; i < s.length; i++) {
        if (s[i] !== goal[i]) {
            // 找到不同的地方,S字符串反转,
            S = s[i] + S;
            GOAL += goal[i];
        }
    }
    // S如果等于GOAL字符串,且长度为2,则是亲密字符串
    return S.length === 2 && S === GOAL;
};