题解:将字符串S变成字符串T的前缀的最少操作次数
问题描述
小U和小R有两个字符串,分别是 S 和 T。现在小U需要通过对 S 进行若干次操作,使其变成 T 的一个前缀。操作可以是修改 S 的某一个字符,或者删除 S 末尾的字符。现在你需要帮助小U计算出,最少需要多少次操作才能让 S 变成 T 的前缀。
关键点
-
前缀的定义:
S变成T的前缀意味着S的前k个字符与T的前k个字符相同,其中k是S的长度。
-
操作类型:
- 修改字符:将
S中的某个字符修改为T中对应位置的字符。 - 删除字符:删除
S末尾的字符,使其长度与T的前缀长度相等。
- 修改字符:将
-
最少操作次数:
- 需要计算出使
S变成T的前缀所需的最少操作次数。
- 需要计算出使
解决方案
我们可以通过以下步骤来解决这个问题:
-
比较字符串长度:
- 如果
S的长度大于T的长度,则需要删除S末尾的字符,使其长度与T的长度相等。 - 计算需要删除的字符数量,并更新
S的长度。
- 如果
-
逐字符比较:
- 遍历
S和T的每个字符,比较它们是否相同。 - 如果字符不同,则需要进行一次修改操作。
- 遍历
-
统计操作次数:
- 统计删除操作和修改操作的总次数。
-
返回结果:
- 返回统计的操作次数,即为最少操作次数。
代码实现
def solution(S: str, T: str) -> int:
count = 0
len_S = len(S)
len_T = len(T)
# 如果 S 的长度大于 T 的长度,删除 S 末尾的字符
if len_S > len_T:
count += len_S - len_T
S = S[:len_T]
# 逐字符比较 S 和 T
for i in range(len(S)):
if S[i] != T[i]:
count += 1
return count
# 测试样例
print(solution("aba", "abb")) # 输出:1
print(solution("abcd", "efg")) # 输出:4
print(solution("xyz", "xy")) # 输出:1
print(solution("hello", "hellowo?ld")) # 输出:0
print(solution("same", "same")) # 输出:0
总结
通过比较字符串长度和逐字符比较,我们可以计算出将 S 变成 T 的前缀所需的最少操作次数。首先删除 S 末尾的多余字符,使其长度与 T 的长度相等,然后逐字符比较并统计修改操作的次数。最终得到的 count 即为最少操作次数。