字符串前缀操作问题分析与解决 | 豆包MarsCode AI刷题

95 阅读4分钟

问题描述

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

问题解决

首先,我询问了豆包有关这道题目的解题思路,豆包对此给出了一个回答:

思路提示

根据这个思路,我再重新组织为如下:

  1. 需要同时遍历两个字符串
  2. 对于不同的字符进行修改操作
  3. 处理字符串长度不同的情况

基于这个思路,我写出了第一版代码:

def Solution(S: str, T: str) -> int:  
    operations = 0  
    i = 0  
    
    # 如果T比S长,先进行字符修改操作  
    while i < min(len(S), len(T)):  
        if S[i] != T[i]:  
            operations += 1  
        i += 1  
    
    # 如果S比T长,需要删除多余的字符  
    if len(S) > len(T):  
        operations += len(S) - len(T)  
    # 如果T比S长,认为需要在S后面添加字符  
    elif len(T) > len(S):  
        operations += len(T) - len(S)  
        
    return operations

接下来,我对这段代码进行了运行测试,但是发现存在一些问题:

image.png

报错的是测试样例4

输入:S = "hello", T = "helloworld"
输出:0

而我的函数给出的输出是5

于是就此我再次询问了豆包,让它对我的代码进行了检查,豆包在检查完后给出了如下回答:

image.png

豆包指出我的代码存在如下几个逻辑错误,并且提出了修改意见:

  1. 逻辑错误:

    • 在处理剩余字符时,代码中的逻辑有误
    • 当len(S) > len(T)时,计算方式不正确
    • 错误地认为可以通过"添加"操作来使S变成T的前缀,但题目只允许修改和删除操作
  2. 修改建议:

    • 需要正确处理字符串长度差异
    • 使用abs(len(S) - len(T))来简化代码
    • 合并处理剩余字符的逻辑

然后豆包也一并给出了修改后的代码:

def solution(S: str, T: str) -> int:
    operations = 0  
    i = 0  
    while i < min(len(S), len(T)):  
        if S[i] != T[i]:  
            operations += 1  
        i += 1  
    # 处理剩余字符
    operations += abs(len(S) - len(T))
    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)

基于豆包给出的建议,我再次重写了一遍代码:

def solution(S: str, T: str) -> int:
    operations = 0  
    i = 0  
    while i < len(S):  
        if i >= len(T):  
            operations += len(S) - i  
            break  
        if S[i] != T[i]:  
            operations += 1  
        i += 1  
    return operations  

之后我再次让豆包对这段代码进行了一次检查:

image.png

豆包发现我的代码已经能够正确的解决问题,最后的提交也是成功通过!

学习心得

说实话,这道题一开始我觉得挺简单的,无非就是字符串比较嘛。结果写完代码一运行,发现测试用例没过,这才意识到自己想得太理所当然了。

最大的收获是意识到自己在写代码时的一个坏习惯:看到题目就急着往下写,没有真正静下心来理解题目的限制条件。比如这次,题目明明说了只能"修改"和"删除",我却自作主张地加入了"添加"操作,这完全是想当然了。

跟豆包交流的过程也很有意思。它不是直接给出答案,而是指出了代码中的逻辑问题,让我自己去思考。特别是在处理字符串长度差异时,原本我写了一堆繁琐的判断,结果一个abs函数就解决了问题。这让我明白,有时候代码写得太复杂,反而容易出错,保持简洁才是王道。

还有一点感触是,在刷题时不能太过追求"一次性通过"。遇到问题后及时寻求帮助,认真分析错误,其实是很好的学习机会。就像这次,通过修改代码的过程,我不仅学会了更好的解决方案,还发现了自己思维中的盲点。