豆包 Mars Code刷题 | 将字符串 S 变成字符串 T 的前缀:最少操作次数计算

63 阅读3分钟

题目:将字符串 S 变成字符串 T 的前缀

问题描述

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

测试样例

  • 样例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

解题思路

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

代码实现

def solution(S: str, T: str) -> int:
    # 初始化操作次数
    operations = 0
    
    # 获取两个字符串的长度
    len_S = len(S)
    len_T = len(T)
    
    # 计算需要删除的字符数
    # 如果 S 的长度大于 T 的长度,需要删除 S 的末尾字符
    if len_S > len_T:
        operations += len_S - len_T
        S = S[:len_T]  # 删除多余的字符
    
    # 逐字符比较 S 和 T
    for i in range(len(S)):
        if S[i] != T[i]:
            operations += 1  # 需要修改字符
    
    return operations

if __name__ == '__main__':
    print(solution("aba", "abb") == 1)
    print(solution("abcd", "efg") == 4)
    print(solution("xyz", "xy") == 1)
    print(solution("hello", "helloworld") == 0)
    print(solution("same", "same") == 0)

问题理解

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

解题思路

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

总结

通过逐字符比较和删除多余字符的操作,我们可以有效地计算出将 S 变成 T 的前缀所需的最少操作次数。这个方法的时间复杂度为 O(n),其中 n 是 S 和 T 中较短字符串的长度。


好了本次分享就到这里了。如果对我感兴趣,可以关注我的GitHub。 也可以加我的飞书一起交流。