题目描述
小U和小R有两个字符串,分别是S和𝑇,现在小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
样例4
输入:S = "hello", T = "helloworld" 输出:0
样例5
输入:S = "same", T = "same" 输出:0
题目解析
本题给定两个字符串S和T,要求通过对S进行操作(修改某字符或删除末尾字符),使其成为T的前缀。这需要我们精确地分析出如何以最少的操作步骤达成目标,重点在于权衡删除字符和修改字符的数量,以求得最小的总操作次数。
代码展示
def solution(S: str, T: str) -> int:
len_S = len(S)
len_T = len(T)
# 计算需要删除的字符数量
deletions = max(0, len_S - len_T)
# 截断 S,使其长度不超过 T
S_new = S[:len_T] if len_S > len_T else S
# 计算需要修改的字符数量
modifications = 0
for i in range(len(S_new)):
if S_new[i] != T[i]:
modifications += 1
# 总操作次数
total_operations = deletions + modifications
return total_operations
if __name__ == '__main__':
print(solution("aba", "abb") == 1) # 输出: True
print(solution("abcd", "efg") == 4) # 输出: True
print(solution("xyz", "xy") == 1) # 输出: True
print(solution("hello", "helloworld") == 0) # 输出: True
print(solution("same", "same") == 0) # 输出: True
思路分析
1. 计算删除字符数量:首先比较S和T的长度。若S比T长,那么需要删除的字符数量就是S超出T长度的部分,即max(0, len_S - len_T)。这一步是为了初步调整S的长度,使其不超出T的范围,避免后续不必要的比较。 2. 截断S:将S截断为长度不超过T的新字符串S_new,方便后续与T进行字符逐一对比。 3. 计算修改字符数量:对S_new和T从前往后逐个字符比较。若对应位置字符不同,则修改次数加1。这样就能确定将S变为T的前缀需要修改多少个字符。 4. 计算总操作次数:总操作次数为删除字符数量与修改字符数量之和,得到最终结果。
知识总结
1. 字符串处理基础:掌握获取字符串长度、字符串截断、字符索引访问等基本操作,这是处理字符串问题的基石。 2. 算法策略选择:本题采用了分步骤处理的策略,先处理长度差异,再对比字符差异。这种分而治之的思想在很多算法问题中都有应用,有助于将复杂问题简单化。 3. 优化思想体现:通过合理的步骤安排,避免了不必要的计算和比较,如先调整长度再比较字符,体现了算法优化中的预处理思想,提高了算法效率。
学习心得
解决这个问题让我认识到,面对字符串操作类的算法题,清晰的逻辑步骤至关重要。不能盲目地进行字符修改或删除尝试,而是要先从宏观上分析字符串的特征,如长度关系等。在编程过程中,对基本数据结构(如字符串)的操作方法要熟练掌握,才能灵活运用。同时,要不断培养算法优化意识,思考如何减少不必要的计算和操作,提高代码的执行效率。每一个小的算法问题都是提升编程思维和技能的宝贵机会,通过不断积累类似的解题经验,能够逐渐提升自己应对复杂编程挑战的能力,在算法设计和编程实现方面更加得心应手。