前言
今天我们来判断两个字符串是否有亲密的关系,如果其中一个字符串中的两个字符经过交换位置与两外一个相等了,那么就称他们为亲密字符串。
题目描述
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
解题思路
分步判断
- 判断最容易判断的,当两个字符串
长度不相等的时候,那么他们肯定不是亲密字符串; - 如果
两个字符串相等,但是字符串中没有重复字符,比如'ab'和'ab',他们无法通过交换变成相等,如果有重复字符呢,比如'abb'和'abb',我们就可以交换重复字符的位置,交换之后结果还是相等,所以这种情况是亲密字符串; - 最后就是
两字符串长度相等,但值不相等的情况了,那么这个时候我们需要记录下他们不相等的字符,
- 如果不相等的字符大于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;
};