[路飞]_亲密字符串

323 阅读1分钟

题目介绍

给你两个字符串 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 由小写英文字母组成

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

解题思路

  • 先判断字符串长度是否相等,不相等就返回true
  • 如果字符串完成相等,判断是否字符串里面是否有一个字符串出现两次以上,有的话就返回true
  • 遍历字符,用数组存储s和goal的不相同字符串的位置
  • 遍历结束判断数组中的长度是否大于2,大于2说明两个字符串不止有两个地方不同,返回false
  • 如果数组等于2, 判断s字符串的第一个不同的位置和goal第二个不同的位置是否相等 且 s字符串的第二个不同的位置和goal第一个不同的位置是否相等, 条件成立返回true否则false

代码

/**
 * @param {string} s
 * @param {string} goal
 * @return {boolean}
 */
var buddyStrings = function(s, goal) {
    if (s.length != goal.length) return false

    if (s === goal) {
        return checkStr(s)
    }
    let arr = []
    for (let i = 0 ; i < s.length ; i++) {
        let si = s[i]
        let gi = goal[i]
        if (si !== gi) {
            arr.push(i)
        }
    }
    if (arr.length > 2) return false
    return s[arr[0]] === goal[arr[1]] && s[arr[1]] === goal[arr[0]]
};

function checkStr(str) {
    let map = {}
    for (let i = 0; i < str.length; i++) {
        if (!map[str[i]]) {
            map[str[i]] = 1
        } else {
            return true
        }
    }
    return false
}