2022/01/[路飞][LeetCode]859_亲密字符串/index

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

给你两个字符串sgoal,只要我们可以通过交换s中的两个字母得到与goal相等的结果,就返回true;否则返回false

交换字母的定义是:取两个下标ij(下标从0开始)且满足i!=j,接着交换s[i]s[j]处的字符。

  • 例如,在abcd中交换下标0和下标2的元素可以生成cbad

示例 1:

1
2
3
输入:s = "ab", goal = "ba"
输出:true
解释:你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 相等。

示例 2:

1
2
3
输入:s = "ab", goal = "ab"
输出:false
解释:你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 不相等。

示例 3:

1
2
3
输入:s = "aa", goal = "aa"
输出:true
解释:你可以交换 s[0] = 'a' 和 s[1] = 'a' 生成 "aa",此时 s 和 goal 相等。

示例 4:

1
2
输入:s = "aaaaaaabc", goal = "aaaaaaacb"
输出:true

提示:

  • 1 <= s.length, goal.length <= 2 * 104
  • sgoal由小写英文字母组成

解题思路

  • 如果sgoal长度不同或s的长度只有1,都为false
  • 如果s===goal,那么s中有重复元素才能满足题意
  • 如果s!=goal,则sgoal只能有2个不同的元素,并且需要满足元素交换位置后相同

这亲密字符串一点也不亲密👀 哈哈~😆

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var buddyStrings = function(s, goal) {
if(s.length!=goal.length||s.length==1) return false
if(s==goal){
let arr = s.split('')
arr = Array.from(new Set(arr))
return s.length!= arr.length
}
let flag = false
let arr = []
for(let i in s){
if(s[i]!=goal[i]) arr.push(i)
}
if(arr.length!=2) return false
let [a,b]= arr
return s[a]==goal[b]&&s[b]==goal[a]
};

如有任何问题或建议,欢迎留言讨论!

文章作者: Joker
文章链接: https://qytayh.github.io/2022/01/[%E8%B7%AF%E9%A3%9E][LeetCode]859_%E4%BA%B2%E5%AF%86%E5%AD%97%E7%AC%A6%E4%B8%B2/index/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker's Blog