亲密字符串
要求
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bu… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
首先有几种情况
-
两字符串长度不等,直接返回false
-
两字符串长度相等,举例:
['ab','ab']、['aa','aa']、['aaaabc','aaaacb']当两字符串相同时
['ab','ab']、['aa','aa'],进行去重,当去重后的长度小于去重前的长度,返回true去重前后长度一致的话,把两字符串不相同的字节找出来,判断长度是否为2,判断反转后是否相同
有趣的例子
但是在这里有个很有趣的例子['aaaab','aaaab']
这两个字符串应该是返回false的,它们不是亲密字符串
但是在力扣上会返回true
代码
var buddyStrings = function (s, goal) {
// 当字符串长度不一样时
if (s.length != goal.length) return false;
// 当字符串相同时(长度肯定一样)
if (s === goal) {
// 会有三种情况:['aa','aa'],['ab','ab'],['aaab','aaab']
// 第一第二种情况返回true、false
// 第三种情况应该返回false才对,但是很不幸的是,我的代码与力扣的代码都返回了true
// 我想这个一个BUG,已经反馈给力扣了,如果有后续,我会更新这篇文章告诉大家
return s.length > new Set(goal).size;
}
// 记录两个字符串不同的地方
let S = '',
GOAL = ''
for (let i = 0; i < s.length; i++) {
if (s[i] !== goal[i]) {
// 找到不同的地方,S字符串反转,
S = s[i] + S;
GOAL += goal[i];
}
}
// S如果等于GOAL字符串,且长度为2,则是亲密字符串
return S.length === 2 && S === GOAL;
};