题目:将字符串 S 变成字符串 T 的前缀
问题描述
小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
- 输入:
- 样例4:
- 输入:
S = "hello", T = "helloworld" - 输出:
0
- 输入:
- 样例5:
- 输入:
S = "same", T = "same" - 输出:
0
- 输入:
解题思路
- 比较字符串长度:首先,比较
S和T的长度。如果S的长度大于T的长度,那么S必须删除末尾的字符,直到其长度等于T的长度。 - 逐字符比较:从
S和T的第一个字符开始,逐字符比较。如果字符相同,继续比较下一个字符;如果字符不同,则需要进行修改操作。 - 计算操作次数:统计需要修改的字符数和需要删除的字符数。
代码实现
def solution(S: str, T: str) -> int:
# 初始化操作次数
operations = 0
# 获取两个字符串的长度
len_S = len(S)
len_T = len(T)
# 计算需要删除的字符数
# 如果 S 的长度大于 T 的长度,需要删除 S 的末尾字符
if len_S > len_T:
operations += len_S - len_T
S = S[:len_T] # 删除多余的字符
# 逐字符比较 S 和 T
for i in range(len(S)):
if S[i] != T[i]:
operations += 1 # 需要修改字符
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)
问题理解
我们需要通过对字符串 S 进行若干次操作(修改字符或删除末尾字符),使其变成字符串 T 的一个前缀。目标是计算出最少需要多少次操作。
解题思路
- 比较字符串长度:首先,比较
S和T的长度。如果S的长度大于T的长度,那么S必须删除末尾的字符,直到其长度等于T的长度。 - 逐字符比较:从
S和T的第一个字符开始,逐字符比较。如果字符相同,继续比较下一个字符;如果字符不同,则需要进行修改操作。 - 计算操作次数:统计需要修改的字符数和需要删除的字符数。
总结
通过逐字符比较和删除多余字符的操作,我们可以有效地计算出将 S 变成 T 的前缀所需的最少操作次数。这个方法的时间复杂度为 O(n),其中 n 是 S 和 T 中较短字符串的长度。