今天我们来看一道中等难度的题目:
问题描述
小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
首先我们要确定S和T的最长公共前缀
确定两个字符串 S 和 T 的最长公共前缀是一个常见的问题,可以通过简单的遍历来实现。最长公共前缀是指 S 和 T 从头开始相同的最长子串。
解题思路
-
理解问题:我们需要找到
S和T的最长公共前缀。 -
数据结构选择:使用字符串操作。
-
算法步骤:
- 遍历
S和T,比较对应位置的字符。 - 如果字符相同,继续比较下一个字符。
- 如果字符不同,或者其中一个字符串已经遍历完,停止遍历。
- 记录遍历到的位置,即为最长公共前缀的长度。
- 遍历
我们可以给出关键步骤:
- 初始化最长公共前缀的长度:
common_prefix_length = 0 - 遍历字符串:
for i in range(min(len(S), len(T))) - 比较字符:
if S[i] == T[i]: common_prefix_length += 1 - 停止遍历:
else: break
然后给出代码:
def solution(S: str, T: str) -> int:
# 初始化操作次数
operations = 0
# 遍历字符串 S 和 T
for i in range(min(len(S), len(T))):
# 如果字符不同,记录修改操作的次数
if S[i] != T[i]:
operations += 1
# 如果 S 的长度大于 T 的长度,记录删除操作的次数
if len(S) > len(T):
operations += 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)
通过使用豆包MarsCode可以有效的节省时间,遇到不会的问题也可以咨询他,对刷题具有极大的帮助。对于学习计算机的同学来说,这也是一个极好的工具。目前豆包MarsCode也是完全免费的。
单击run,查看控制台,全部都是True,基本通过!
单击提交提交通过,该题目完成。