-
发表于 2024.07.14
-
需要一些观察和分析,首先,在同一个下标
i
下,如果s1[i]
为x
,而s2[i]
为y
,将其记为xy
对;如果s1[i]
为y
,而s2[i]
为x
,将其记为yx
对。那么,如果存在两个相同的xy
对(或者两个相同的yx
对),那么可以通过一次交换将这两个对应的下标变为相同的字符;而如果仅有一个xy
对以及一个yx
对,那么需要两次交换才能将其变为相同的字符。对于整个字符串而言,如果xy
对和yx
对的个数总和为奇数,那么无法将其变为相同的字符串(不难证明,上述情况下,两个字符串的x
个数为奇数,y
个数,不可能能做到两个字符串相等)。如果为偶数,则存在可行解,且最优解可通过贪心的做法,尽量先同类对交换(只需要一次交换操作)(即xy
对内部两两匹配,yx
对内部两两匹配),如果最后剩下一个xy
对和一个yx
对,那么需要两次交换。class Solution: def minimumSwap(self, s1: str, s2: str) -> int: xy_pair_cnt = yx_pair_cnt = 0 for s1_ch, s2_ch in zip(s1, s2): if s1_ch != s2_ch: if s1_ch == 'x': xy_pair_cnt += 1 else: yx_pair_cnt += 1 if (xy_pair_cnt + yx_pair_cnt) % 2: return -1 more, less = max(xy_pair_cnt, yx_pair_cnt), min(xy_pair_cnt, yx_pair_cnt) return more // 2 + less // 2 + more % 2 + less % 2
- LC 题目链接
-