在进行每日的AI刷题时,并不是所有的题目都得心应手,有些题目会遇到卡手的情况,例如如下题目:
问题描述
小U和小R有两个字符串,分别是S和T,现在小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
错误的思考过程
一开始我错误地认为只需要从字符串的开头比较字符,当遇到不同字符时就直接修改。例如在样例1中,我看到S = "aba"和T = "abb",想着先比较第一个字符a和a,相同;然后比较第二个字符b和b,相同;最后比较第三个字符a和b,直接修改这个字符,得出操作次数为1,但这只是根据样例巧合得到了正确答案。这种思考方式没有考虑到整体的操作逻辑,没有考虑到删除操作的必要性,所以在编辑和测试更多用例的时候显示未通过。
其次我没有考虑从整体上分析问题,没有意识到可以通过动态规划或者类似的递推方法来计算最少的操作次数。例如,没有尝试从空字符串开始逐步构建S成为T的前缀,而是孤立地比较每个字符,导致在复杂情况(如较长的字符串或者字符重复较多的情况)下无法准确计算操作次数。
错误的代码思路
def solution(S, T):
m, n = len(S), len(T)
if m > n:
return float('inf') # S太长,无法变为T的前缀
# 错误的比较方向,只修改不考虑删除
for i in range(min(m, n)):
if S[i] != T[i]:
# 错误地认为只需要修改第一个不匹配的字符
return i + 1 # 错误地返回操作次数
return 0 # 如果S是T的前缀,返回0
# 测试样例
print(solution("aba", "abb") == 1) # 错误地认为操作次数为1
print(solution("abcd", "efg") == 4) # 错误地认为操作次数为4
print( solution("xyz", "xy") == 1 ) # 错误地认为操作次数为1
解决过程
我利用了右侧的MarsCode AI 工具,进行了代码的检查和思路的检查,发现了上述思路的错误,于是我让AI工具帮我重新解析了题解思路:
正确的代码
def solution(S: str, T: str) -> int:
len_s = len(S)
len_t = len(T)
i = 0
j = 0
count = 0
while i < len_s and j < len_t:
if S[i]!= T[j]:
if i < len_s - 1:
# 如果不是最后一个字符,可以修改字符
count += 1
else:
# 如果是最后一个字符,只能删除
count += 1
i += 1
else:
i += 1
j += 1
# 如果S还有剩余字符,只能删除
while i < len_s:
count += 1
i += 1
return count
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)
感悟
通过AI的帮助,我成功的解决了该问题,并且编写出了正确的代码,AI刷题的好处在于方便,我们不需要去打开其他的AI软件去寻找自己的答案,遇到困难无法解决时也不会耽搁太多的时间,可以点击右侧的AI工具进行思路的提示,代码的提示和代码的检查,非常的方便,比如这道题,我就通过AI工具,成功的查出了自己的问题,并最终根据AI工具给出的正确的思路,完成了完整的解答过程,受益匪浅