中等题:最少前缀操作问题 | 豆包MarsCode AI刷题

61 阅读3分钟

1、问题

1.1 问题描述

小U和小R有两个字符串,分别是S和T,现在小U需要通过对S进行若干次操作,使其变成T的一个前缀。操作可以是修改S的某一个字符,或者删除S末尾的字符。现在你需要帮助小U计算出,最少需要多少次操作才能让S变成T的前缀。

1.2 测试样例

样例1:

输入:S = "aba", T = "abb"
输出:1

样例2:

输入:S = "abcd", T = "efg"
输出:4

样例3:

输入:S = "xyz", T = "xy"
输出:1

样例4:

输入:S = "hello", T = "helloworld"
输出:0

样例5:

输入:S = "same", T = "same"
输出:0

2、思路

2.1 问题分析

我们需要将字符串 S 变成字符串 T 的一个前缀。为了实现这一目标,我们可以采取以下两种操作:

  • 修改字符:将 S 中的某个字符修改为 T 中对应位置的字符。
  • 删除字符:删除 S 末尾的字符,使其长度与 T 的前缀长度相匹配。

2.2 操作顺序

首先,我们需要确保 S 的长度不超过 T 的长度。如果 S 比 T 长,我们需要先删除 S 末尾的多余字符,使其长度与 T 的前缀长度相同。

然后,我们逐个比较 S 和 T 中相同位置的字符。如果字符不同,则需要进行一次修改操作。

2.3 操作次数计算

  • 删除操作:如果 S 的长度大于 T 的长度,我们需要删除 S 末尾的多余字符,删除的次数为 len(S) - len(T)
  • 修改操作:遍历 S 和 T 的相同长度的部分,统计需要修改的字符数。

2.4 最终结果

将删除操作和修改操作的次数相加,即为将 S 变成 T 的前缀所需的最少操作次数。

总结一下,整体的步骤分为以下几点:

  • 初始化操作次数
    • 创建一个变量 result 来记录总的操作次数,初始值为 0
  • 处理长度差异
    • 比较 S 和 T 的长度。如果 len(S) > len(T),则需要删除 S 末尾的多余字符,使其长度与 T 相同。
    • 计算需要删除的字符数,即 len(S) - len(T),并将其累加到 result 中。
    • 截取 S 使其长度与 T 相同,即 S = S[:len(T)]
  • 逐字符比较
    • 遍历 S 和 T 的相同长度的部分(即 S[:len(T)] 和 T)。
    • 对于每个位置 i,如果 S[i] != T[i],则需要进行一次修改操作,将 result 加 1
  • 返回结果
    • 最终返回 result,即最少需要的操作次数。

3、代码

整体代码如下:

def solution(S: str, T: str) -> int:
    # 初始化操作次数
    result = 0
    # 如果 S 比 T 长,先删除多余的字符
    if len(S) > len(T):
        # 计算需要删除的字符数
        result += len(S) - len(T)
        # 截取 S 使其长度与 T 相同
        S = S[:len(T)]
    # 遍历 S 和 T 的相同长度的部分,计算需要修改的字符数
    for i in range(len(S)):
        # 如果对应位置的字符不同,累加操作次数
        if S[i] != T[i]:
            result += 1
    # 返回总操作次数
    return result

4、运行结果

可以看到提交通过,说明我们的方法和代码都没有问题。 屏幕截图 2024-11-15 125112.png

5、总结分析

5.1 时间复杂度

该算法的时间复杂度为 O(n),其中 n 是 S 和 T 中较短的那个字符串的长度。因为我们只需要遍历一次字符串,进行比较和计数操作。

5.2 空间复杂度

该算法的空间复杂度为 O(1),因为我们只使用了常数个额外的变量来存储中间结果,没有使用额外的数据结构。

通过上述详细的解题思路和步骤,我们可以有效地计算出将字符串 S 变成字符串 T 的前缀所需的最少操作次数。该算法的时间复杂度为 O(n),空间复杂度为 O(1),具有较高的效率和较低的空间开销。