前端算法小白攻略15-leetcode(亲密字符串)

172 阅读2分钟

前言

今天我们来判断两个字符串是否有亲密的关系,如果其中一个字符串中的两个字符经过交换位置与两外一个相等了,那么就称他们为亲密字符串。

题目描述

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. 判断最容易判断的,当两个字符串长度不相等的时候,那么他们肯定不是亲密字符串;
  2. 如果两个字符串相等,但是字符串中没有重复字符,比如'ab'和'ab',他们无法通过交换变成相等,如果有重复字符呢,比如'abb'和'abb',我们就可以交换重复字符的位置,交换之后结果还是相等,所以这种情况是亲密字符串;
  3. 最后就是两字符串长度相等,但值不相等的情况了,那么这个时候我们需要记录下他们不相等的字符
  • 如果不相等的字符大于2了,那么他们就无法通过一次交换变成相等的值,就不是亲密字符串
  • 如果不相等的字符等于2,我们还需要判断我们记录的s与goal中不相等的字符是否能达到颠倒字符相等的条件,如果是才证明s和goal是亲密字符串,这里我们可以在第一次遍历的同时将其中一个记录字符倒序拼接,之后直接就可以进行比较

开始解题

/**
 * @param {string} s
 * @param {string} goal
 * @return {boolean}
 */
var buddyStrings = function(s, goal) {
    if(s.length !== goal.length) return false;    // 长度不等,false
    if(s === goal){
        if(s.length === (new Set(goal).size)) return false; // 长度相等但没有重复字符, false
        return true;
    }
    let i = 0;
    let a = '';
    let b = '';
    while(i < s.length) {
        if(s[i] !== goal[i]) {
            a = s[i] + a;  // 后面的字符加前面的 反转
            b += goal[i];
        };
        if(a.length > 2) return false;
        i++;
    }
    return a.length === 2 && a === b;
};