400. 小M的字符串变换挑战 | 豆包MarsCode AI刷题

87 阅读3分钟

400. 小M的字符串变换挑战

题目用python通过,如有需要请用ai转义成其他代码,由于这道题代码没有太复杂,看看自己写也成。


题目描述:小M有两个长度相等的字符串 s 和 t。她想通过一次操作将字符串 s 变成 t。这个操作是选择两个不同的字母,并将 s 中的这两种字母在所有出现的位置进行任意顺序的互换。

小M想知道是否可以恰好通过一次操作将 s 变成 t。如果可以,请返回一个长度为2的数组,表示所选择的两个字母。如果有多种方案,请输出字典序最小的方案(第一种字母 ASCII 码值尽可能小,若第一种字母 ASCII 码值相同,则第二种字母 ASCII 码值尽可能小)。

如果无解,那么返回一个空数组。


解题思路:
第一思路:

暴力模拟,直接干。 让marscode帮我们生成代码。 我们来看下思路:

  1. 检查字符串长度是否相等:如果长度不相等,直接返回空数组。
  2. 记录不同的位置:遍历字符串,找出 s 和 t 中不同的位置,并记录这些位置。
  3. 检查不同的位置数量:如果不同的位置超过两个,无法通过一次操作完成,返回空数组。
  4. 获取不同的字符:根据不同的位置,获取需要交换的字符。
  5. 检查是否可以通过一次操作完成:检查交换后的字符是否与 t 中的字符匹配。
  6. 返回结果:如果可以通过一次操作完成,返回字典序最小的交换字符对;否则返回空数组。

这里如果直接输入豆包的代码,是肯定会报错的, 因为豆包只记录了不同位置的数量,并没有考虑不同位置可能是相同的字符,这样也可以算作一次操作。我们可以用字典记录不同字符出现的数量, 判断是否有大于两个的字符。

第一次调试

将这句话喂给豆包。
可以使用字典来记录字符串 s 和 t 中每个字符的出现次数,并检查它们是否可以通过一次操作变成相同的字符串。如果不同字符的数量大于2,那么显然无法通过一次操作完成。但是豆包却用字典记录了每个不同的字符及其位置,这样对字符统计的意义就不大了。 显然豆包对我们的言语理解有误。

第二次调试

直接告诉豆包:不用记录位置,只用记录出现几个不同种类的的字符就可以。让豆包清楚明白我们的意图。只记录不同种类的字符,而不需要记录具体的位置。

这样告诉豆包之后,就生成了能满足我们要求的代码,直接通过测试啦!!!!


通过代码如下:

def solution(s: str, t: str) -> list:
    # 检查字符串长度是否相等
    if len(s) != len(t):
        return []

    # 记录不同的字符种类
    diff_chars = set()

    # 遍历字符串,找出不同的字符种类
    for i in range(len(s)):
        if s[i] != t[i]:
            diff_chars.add(s[i])
            diff_chars.add(t[i])

    # 如果不同的字符种类超过两个,无法通过一次操作完成
    if len(diff_chars) != 2:
        return []

    # 将不同的字符种类转换为列表并排序
    diff_chars = sorted(list(diff_chars))

    # 返回字典序最小的交换字符对
    return diff_chars