[路飞]_程序员必刷力扣题: 859. 亲密字符串

208 阅读2分钟

「这是我参与12月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

859. 亲密字符串

给你两个字符串 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 * 104
  • s 和 goal 由小写英文字母组成

一次遍历

思路

要比较两个字符串是否满足条件,至少要遍历一次整个字符串,才能知道准确结果

处理边界:

  • 字符串长度相等,不等返回false
  • 字符串长度小于2,直接返回false,因为题干中至少两个位置交换

这里我们要分情况讨论:

  • 两字符串完全相等的情况

    判断字符串中书否存在重复元素,存在则返回true(因为重复的元素可以可以两两交换不改变字符串),否则返回false

  • 两字符串不相等的情况

    如果两字符串不相等,那么就属于常规处理,即字符串同一位置位置的元素存在不相等的情况。

    • 这里我们用两个变量diffStr1,diffStr2,来保存不相等位置的字符串,当遍历到这里不相等的时候就将两个字符串中这个位置的元素都拼接在变量diffStr1,diffStr2中

    • 那么返回true的条件就是:1.diffStr1的字符串的长度必须===2。2.diffStr1[0] === diffStr2[1]。 3.diffStr1[1] === diffStr2[0]

    • 此外直接返回false

var buddyStrings = function (s, goal) {
    if (s.length !== goal.length || s.length === 1) return false
    var diffStr1 = '', diffStr2 = '', index = 0
    var stack = []
    var hasRepeat = false
    while (index < s.length) {                                                                                            
        var sItem = s[index]
        var goalItem = goal[index]
        if (!hasRepeat) {
            if (stack.includes(sItem)) hasRepeat = true
            stack.push(sItem)
        }
        if (sItem !== goalItem) {
            if(diffStr1.length===2) return false
            diffStr1+=sItem
            diffStr2+=goalItem
        }
        index++
    }
    //相同
    if (s === goal && s.length >= 2) {
        if (hasRepeat) return true
        if (!hasRepeat) return false
    }
    //不同
    if (diffStr1.length===2&&diffStr1[0]===diffStr2[1]&&diffStr2[0]===diffStr1[1]) {
        return true
    }
    return false
};