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

87 阅读2分钟

1.题目

问题描述

小U和小R有两个字符串,分别是SS和TT,现在小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

2.思路

拿到这道题,发现和之前做过的DNA序列编辑距离问题很像

小R正在研究DNA序列,他需要一个函数来计算将一个受损DNA序列(dna1)转换成一个未受损序列(dna2)所需的最少编辑步骤。编辑步骤包括:增加一个碱基、删除一个碱基或替换一个碱基。

所以先入为主地认为需要用动态规划,但是仔细看过之后发现还是有很大的差别,这道题只能修改S的某一个字符,或者删除S末尾的字符,不能在中间插入或删除,并且需要S等于T的前缀,所以只要从前往后比较,不同则换,比完后S还剩的就要删除

3.代码

def solution(S: str, T: str) -> int:
    # write code here
    cnt = 0
    i = 0
    while i < (len(S)) and i < len(T):
        if S[i] != T[i]:
            # 不一样则替换
            cnt += 1
        i += 1
    # 如果S有剩余,需要删除
    if len(S) > len(T):
        cnt += len(S) - len(T)
    return cnt

if __name__ == '__main__':
    print(solution("aba", "abb"))
    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)

4.参考资料

数组元素之和最小化& 最少前缀操作问题-CSDN博客