最少前缀操作问题
问题描述
小U和小R有两个字符串,分别是和,现在小U需要通过对进行若干次操作,使其变成的一个前缀。操作可以是修改的某一个字符,或者删除末尾的字符。现在你需要帮助小U计算出,最少需要多少次操作才能让变成 的前缀。
测试样例
样例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
解决思路
首先对于前缀的理解,是的前缀,那么就必须是的子串,而且的开始位置就是的开始位置。需要与的左边开始的部分相同。
因此的长度需要小于等于,如果的长度超过了,那么我们需要把末尾的字符删除,直到和等长
接下来我们需要让成为的前缀,我们需要对与逐字符比较,如果出现不同的字符,我们需要进行一次修改操作
因此总的操作次数 = 删除末尾的操作 + 修改字符的操作
AI给的思路
Prompt
需要一点思路提示
AI的回答
问题理解
我们需要通过对字符串 S 进行若干次操作,使其变成字符串 T 的一个前缀。操作可以是修改 S 的某一个字符,或者删除 S 末尾的字符。目标是计算出最少需要多少次操作才能让 S 变成 T 的前缀。
数据结构选择
由于我们只需要处理字符串,不需要额外的数据结构。
算法步骤
- 初始化操作次数:首先,我们需要初始化一个变量来记录操作次数。
- 比较字符串长度:如果
S的长度大于T的长度,那么我们需要删除S末尾的字符,直到S的长度等于T的长度。 - 逐字符比较:从字符串的开头开始,逐字符比较
S和T。如果字符不同,则需要进行一次修改操作。 - 返回结果:最后,返回总的操作次数。
关键点
- 如果
S的长度大于T的长度,需要删除S末尾的字符。 - 逐字符比较时,如果字符不同,需要进行一次修改操作。
代码实现
def solution(S: str, T: str) -> int:
# write code here
ns = len(S)
nt = len(T)
res = 0
if ns > nt:
res = ns - nt
n = min(ns, nt)
for i in range(n):
if S[i] != T[i]:
res += 1
return res
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)
只是计算总的操作次数,所以不需要真的去修改
因为删除末尾字符的操作自由度没有修改字符的操作高,所以最少的操作次数一定是通过修改字符得来的,可能有的结果可以通过删除末尾字符得到新的满足的前缀,而不需要进行修改字符操作,但删除末尾字符能够得到满足的结果,修改字符一样能得到。