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

109 阅读3分钟

最少前缀操作问题

问题描述

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

测试样例

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

解决思路

首先对于前缀的理解,SSTT的前缀,那么SS就必须是TT的子串,而且SS的开始位置就是TT的开始位置。SS需要与TT的左边开始的部分相同。

因此SS的长度需要小于等于TT,如果SS的长度超过了TT,那么我们需要把SS末尾的字符删除,直到和TT等长

接下来我们需要让SS成为TT的前缀,我们需要对SSTT逐字符比较,如果出现不同的字符,我们需要进行一次修改操作

因此总的操作次数 = 删除SS末尾的操作 + 修改SS字符的操作

AI给的思路

Prompt

需要一点思路提示

AI的回答

问题理解

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

数据结构选择

由于我们只需要处理字符串,不需要额外的数据结构。

算法步骤
  1. 初始化操作次数:首先,我们需要初始化一个变量来记录操作次数。
  2. 比较字符串长度:如果 S 的长度大于 T 的长度,那么我们需要删除 S 末尾的字符,直到 S 的长度等于 T 的长度。
  3. 逐字符比较:从字符串的开头开始,逐字符比较 S 和 T。如果字符不同,则需要进行一次修改操作。
  4. 返回结果:最后,返回总的操作次数。
关键点
  • 如果 S 的长度大于 T 的长度,需要删除 S 末尾的字符。
  • 逐字符比较时,如果字符不同,需要进行一次修改操作。

代码实现

def solution(S: str, T: str) -> int:
    # write code here
    ns = len(S)
    nt = len(T)
    res = 0
    if ns > nt:
        res = ns - nt
    n = min(ns, nt)
    for i in range(n):
        if S[i] != T[i]:
            res += 1
    return res

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)

只是计算总的操作次数,所以不需要真的去修改SS

因为删除末尾字符的操作自由度没有修改字符的操作高,所以最少的操作次数一定是通过修改字符得来的,可能有的结果可以通过删除末尾字符得到新的满足的前缀,而不需要进行修改字符操作,但删除末尾字符能够得到满足的结果,修改字符一样能得到。