• 作者:老汪软件技巧
  • 发表时间:2024-11-29 04:03
  • 浏览量:

15. 最少前缀操作问题问题描述

给定两个字符串 SSS 和 TTT,我们需要通过对 SSS 进行若干次操作,使其变成 TTT 的前缀。操作有两种类型:

修改操作:可以修改 SSS 中任意一个字符,使其变为 TTT 对应位置的字符。删除操作:可以删除 SSS 中末尾的字符,直到 SSS 的长度小于或等于 TTT 的长度。

要求计算出最少需要多少次操作才能将 SSS 转换为 TTT 的前缀。

思路解析1. 理解前缀匹配

首先,什么是前缀?前缀是指一个字符串的开头部分。例如,字符串 "abc" 的前缀包括:""(空字符串)、"a"、"ab" 和 "abc"。题目要求的是将字符串 SSS 变成 TTT 的前缀,这意味着我们只需要保留 SSS 的前缀部分,使其与 TTT 一致,并删除 SSS 中多余的字符或修改不匹配的字符。

2. 确定最大公共前缀

要实现这个目标,我们首先需要找到 SSS 和 TTT 的最大公共前缀。这个前缀是 SSS 和 TTT 从左到右相同的部分。任何不属于这个公共前缀的部分都需要进行操作。

举个例子,假设:

那么它们的最大公共前缀就是 "ab",后面的 "cd" 和 "ef" 需要进行操作。后面我们就需要分析如何最少地进行修改或删除操作。

3. 修改和删除操作4. 优化思路

为了求得最少的操作次数,我们可以分成两步来计算:

找到最大公共前缀的长度。对于公共前缀之后的部分,分别进行修改操作和删除操作。

具体操作的次数就可以通过以下方式计算:

解题步骤计算最大公共前缀长度:从 SSS 和 TTT 的开头开始比较,直到遇到第一个不相同的字符或者任意一个字符串结束。修改操作:对于不匹配的字符,每次操作可以修改 SSS 中的字符,使其与 TTT 对应位置的字符一致。删除操作:如果 SSS 的长度超过 TTT,则需要删除 SSS 中的多余字符。返回操作次数:将修改操作和删除操作的次数加起来即为最少的操作次数。代码实现

def solution(S: str, T: str) -> int:
    # 找到S和T的最大公共前缀长度
    common_prefix_length = 0
    while common_prefix_length < len(S) and common_prefix_length < len(T) and S[common_prefix_length] == T[common_prefix_length]:
        common_prefix_length += 1

AI 刷题 15. 最少前缀操作问题 题解 | 豆包MarsCode AI刷题__AI 刷题 15. 最少前缀操作问题 题解 | 豆包MarsCode AI刷题

# 修改操作:S中与T不匹配的字符 modify_operations = sum(1 for i in range(common_prefix_length, len(T)) if S[i] != T[i]) # 删除操作:删除S末尾多余的字符 delete_operations = len(S) - common_prefix_length # 返回修改和删除操作的总数 return modify_operations + delete_operations # 测试用例 if __name__ == '__main__': print(solution("aba", "abb")) # 1 (修改S的第三个字符) print(solution("abcd", "efg")) # 4 (修改前缀并删除多余字符) print(solution("xyz", "xy")) # 1 (删除S的第三个字符) print(solution("hello", "helloworld")) # 0 (已经是前缀) print(solution("same", "same")) # 0 (已经是前缀)

复杂度分析空间复杂度:O(1)O(1)O(1)


上一条查看详情 +在鸿蒙应用中 Debug 对开发者的帮助
下一条 查看详情 +没有了