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

54 阅读2分钟

今天在豆包MarsCode刷题中刷到这样一道题目

问题描述

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

问题理解

我们需要通过对字符串 S 进行若干次操作(修改字符或删除末尾字符),使其变成字符串 T 的一个前缀。目标是计算出最少需要多少次操作。

解题思路

  1. 比较字符串长度:首先,比较 S 和 T 的长度。如果 S 的长度大于 T 的长度,那么 S必须删除末尾的字符,直到其长度等于 T 的长度。
  2. 逐字符比较:从 S 和 T 的第一个字符开始,逐字符比较。如果字符相同,继续比较下一个字符;如果字符不同,则需要进行一次修改操作。
  3. 计算操作次数:统计需要修改的字符数和需要删除的字符数,两者之和即为最少操作次数。

代码实现

def solution(S: str, T: str) -> int:

# write code here

# 初始化操作次数

operations = 0

# 获取两个字符串的长度

len_S = len(S)

len_T = len(T)

# 计算需要删除的字符数

# 如果 S 的长度大于 T 的长度,需要删除 S 末尾的字符

if len_S > len_T:

operations += len_S - len_T

# 更新 S 的长度

len_S = len_T

# 逐字符比较 S 和 T 的前缀部分

for i in range(len_S):

# 如果字符不同,需要进行一次修改操作

if S[i] != T[i]:

operations += 1

return operations

关键步骤注释

  1. 初始化操作次数operations = 0
  2. 获取字符串长度len_S = len(S) 和 len_T = len(T)
  3. 计算需要删除的字符数:如果 len_S > len_T,则需要删除 S 末尾的字符,更新 operations 和 len_S
  4. 逐字符比较:使用 for 循环逐字符比较 S 和 T 的前缀部分,如果字符不同,增加 operations

那么这道题目属于什么题型呢,我们下次应该怎么解决这类问题呢

这道题属于字符串操作的题型。具体来说,它涉及到字符串的比较和编辑距离的概念。

解决这类问题的方法

字符串操作

  • 逐字符比较:从字符串的第一个字符开始,逐字符比较 S 和 T。如果字符相同,继续比较下一个字符;如果字符不同,则需要进行一次修改操作。
  • 删除操作:如果 S 的长度大于 T 的长度,需要删除 S 末尾的字符,直到其长度等于 T 的长度。