持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情
一、题目描述:
给你两个字符串 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 相等。
提示:
- 1 <= s.length, goal.length <= 2 * 10^4
- s 和 goal 由小写英文字母组成
二、思路分析:
- 如果两个字符串不相等,则为false
- 如果两个字符串相等,如果set去重后,小于字符串的长度, 则被去重的元素一定和留下的set集合元素存在相等的元素,这两个元素交换位置后,不影响原元素
- 首先遍历两个字符串,找出在相同位置的索引下不相等的元素
- 找出的元素是两个,且集合set内的元素相同(注意,set元素不考虑顺序,只考虑元素),则可以交换
三、AC 代码:
class Solution:
def buddyStrings(self, s: str, goal: str) -> bool:
n1 = len(s)
n2 = len(goal)
a = []
b= []
if s == goal and len(set(s)) < len(s) :
return True
for i in range(n1):
if s[i]!=goal[i]:
a.append(s[i])
b.append(goal[i])
if n1!=n2 or len(a)>2:
return False
print(a)
print(b)
if len(a)==2 and set(a)==set(b):
return True
return False
四、参考:
【zljhero】亲密字符串:只有两个字符不等且互相相等;或字符串匹配并存在个数>2的字符 - 亲密字符串 - 力扣(LeetCode)