leetcode-1247

本文最后更新于:2023年2月25日 晚上

题目描述

1247

思路及实现

看完题目及示例,能够很快想到要使两个字符串相等,那么两个字符串中的'x''y'的数量应该相等,所以可以先统计一下两者的数量,如果不同可以直接返回-1
接下来从示例中寻找其他的情况,这边有两种思路:

  1. 从示例4着手,这是我一开始的思路。用暴力方法来解决示例4,会发现需要6次才能够解决;那么4次怎么来的呢?那肯定是有选择性的交换,即优先选择更优方案;仔细观察交换,就能够发现其实有两种交换方案:第一种,s1 = 'x...x''s2 = 'y...y'交换,这种情况下仅需一次交换;第二种,s1 = 'x...y's2 = 'y...x'交换,这种情况下需两次交换。那我们就更多地进行第一种交换就行了。
  2. 总结数学规律,统计s1[i] = 'x', s2[i] = 'y's1[i] = 'y', s2[i] = 'x'的数量,计算结果。
    这其中的思路2涉及到的详细数学规律,可以跳转至官解观看。
    下面是思路1的代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class Solution:
    def minimumSwap(self, s1: str, s2: str) -> int:
    if (s1.count('x') + s2.count('x')) % 2 != 0: # 两字符串能够相同的前提是x或y的个数为偶数个
    return -1
    ans = 0
    n = len(s1)
    for index_1 in range(n):
    if s1[index_1] != s2[index_1]: # 两个字符串中当前字符不相同
    flag = False
    for index_tmp in range(index_1 + 1, n): # 贪心往后找和当前字符一样的情况
    if s1[index_1] == s1[index_tmp] and s2[index_1] == s2[index_tmp]: # 找到了的话交换次数+1,修改字符串
    ans += 1
    flag = True
    s1 = s1[:index_tmp] + s2[index_1] + s1[index_tmp + 1:n] # s1[index_tmp] = s2[index_1]
    s2 = s2[:index_1] + s1[index_1] + s2[index_1 + 1:n] # s2[index_1] = ch_1
    break
    if not flag: # 没找到,就是需要交换两次的情况:'x...y', 'y...x'
    for index_tmp in range(index_1 + 1, n):
    if s1[index_1] == s2[index_tmp] and s2[index_1] == s1[index_tmp]: # 交换次数+2,修改字符串
    ans += 2
    # s2[index_1] = ch_1, s2[index_tmp] = s1[index_tmp]
    s2 = s2[:index_1] + s1[index_1] + s2[index_1 + 1:index_tmp] + s1[index_tmp] + s2[index_tmp + 1:n]
    break
    return ans
    写得非常复杂,但是不涉及复杂数学规律,简单易懂(自己认为的),可以在此之上总结出数学规律。

这里有一只爱丽丝

希望本文章能够帮到您~


leetcode-1247
https://map1e-g.github.io/2023/02/25/leetcode-1247/
作者
MaP1e-G
发布于
2023年2月25日
许可协议