青训营X豆包MarsCode AI刷题-5 | 豆包MarsCode AI 刷题

42 阅读2分钟

题解:将字符串S变成字符串T的前缀的最少操作次数

问题描述

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

关键点

  1. 前缀的定义

    • S 变成 T 的前缀意味着 S 的前 k 个字符与 T 的前 k 个字符相同,其中 kS 的长度。
  2. 操作类型

    • 修改字符:将 S 中的某个字符修改为 T 中对应位置的字符。
    • 删除字符:删除 S 末尾的字符,使其长度与 T 的前缀长度相等。
  3. 最少操作次数

    • 需要计算出使 S 变成 T 的前缀所需的最少操作次数。

解决方案

我们可以通过以下步骤来解决这个问题:

  1. 比较字符串长度

    • 如果 S 的长度大于 T 的长度,则需要删除 S 末尾的字符,使其长度与 T 的长度相等。
    • 计算需要删除的字符数量,并更新 S 的长度。
  2. 逐字符比较

    • 遍历 ST 的每个字符,比较它们是否相同。
    • 如果字符不同,则需要进行一次修改操作。
  3. 统计操作次数

    • 统计删除操作和修改操作的总次数。
  4. 返回结果

    • 返回统计的操作次数,即为最少操作次数。

代码实现

def solution(S: str, T: str) -> int:
    count = 0
    len_S = len(S)
    len_T = len(T)

    # 如果 S 的长度大于 T 的长度,删除 S 末尾的字符
    if len_S > len_T:
        count += len_S - len_T
        S = S[:len_T]

    # 逐字符比较 S 和 T
    for i in range(len(S)):
        if S[i] != T[i]:
            count += 1

    return count

# 测试样例
print(solution("aba", "abb"))  # 输出:1
print(solution("abcd", "efg"))  # 输出:4
print(solution("xyz", "xy"))  # 输出:1
print(solution("hello", "hellowo?ld"))  # 输出:0
print(solution("same", "same"))  # 输出:0

总结

通过比较字符串长度和逐字符比较,我们可以计算出将 S 变成 T 的前缀所需的最少操作次数。首先删除 S 末尾的多余字符,使其长度与 T 的长度相等,然后逐字符比较并统计修改操作的次数。最终得到的 count 即为最少操作次数。