Skip to content

Latest commit

 

History

History
71 lines (59 loc) · 2.1 KB

16_字符串_859. 亲密字符串.md

File metadata and controls

71 lines (59 loc) · 2.1 KB

-- 字符串 - easy

给你两个字符串 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 相等。

// 1、两个字符串长度不相等:false
// 2、两个字符串相等:
//      长度相等:有重复字符:true;无重复字符串:false;
// 3、两个字符串长度相等,值不等:
//      找出两点不同,且交换位置后值相同
var buddyStrings = function (s, goal) {
    // 1、两个字符串长度不相等:false
    if (s.length !== goal.length) { return false }

    // 2、两个字符串相等:
    const sArr = s.split('');
    if (s === goal) {
        // 长度相等:有重复字符:true;无重复字符串:false;
        if ([...new Set(sArr)].length !== s.length) { return true }
        else { return false }
    }

    // 3、两个字符串长度相等,值不等:
    //      找出两点不同,且交换位置后值相同
    let [start, end] = [-1, -1]
    for (let i in s) {
        if (s[i] != goal[i]) {
            if (start == -1) {
                start = i
            } else if (end === -1) {
                end = i
            } else {
                return false
            }
        }
    }
    return end !== -1 && s[start] === goal[end] && goal[start] === s[end]
};