JZX轻语:简
LeetCode 1247 - 交换字符使得字符串相同
发表于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