leetcode笔记之[859. 亲密字符串]

49 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

一、题目描述:

859. 亲密字符串 - 力扣(LeetCode)

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

交换字母的定义是:取两个下标 ij (下标从 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 由小写英文字母组成

二、思路分析:

  1. 如果两个字符串不相等,则为false
  2. 如果两个字符串相等,如果set去重后,小于字符串的长度, 则被去重的元素一定和留下的set集合元素存在相等的元素,这两个元素交换位置后,不影响原元素
  3. 首先遍历两个字符串,找出在相同位置的索引下不相等的元素
  4. 找出的元素是两个,且集合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)