刷题刷题刷题 | 豆包MarsCode AI 刷题

39 阅读4分钟

问题描述
小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
我的想法是初始化一个计数器 operations 为 0,用于记录操作次数。
使用两个指针 i 和 j 分别指向 S 和 T 的开头。
遍历 T 字符串(因为我们要找 T 的前缀),同时移动 i 和 j 指针:
如果 S[i] == T[j],则两个指针都向前移动。
如果 S[i] != T[j],则有两种选择:
修改 S[i] 为 T[j](这算作一次操作),然后两个指针都向前移动。
或者,如果 i 不是 S 的最后一个字符,我们可以选择删除 S[i](即不移动 j,只移动 i),这也算作一次操作。但在这个策略中,我们更倾向于先尝试修改,因为删除操作实际上是在后续过程中“隐含”进行的(当我们遍历完 S 但还没遍历完 T 的前缀时,剩下的 T 的前缀长度就代表了还需要删除的字符数)。
注意,如果 i 已经遍历完 S 但 j 还没有遍历完 T,则剩下的 T 的前缀长度就是还需要的操作次数(因为此时只能通过删除操作来匹配)。
但是,上述策略可以进一步简化,因为我们不需要真的去修改 S,而是计算理论上需要的操作次数。我们可以直接比较 S 的子串和 T 的前缀,记录不匹配的位置,然后计算总的不匹配数(包括需要通过删除来匹配的部分)。

问题描述
小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子,小S决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,且ID按从小到大的顺序排列。
例如,单词“夏天”可能出现在帖子1、帖子3和帖子7中,那么这个单词的倒排链就是 [1, 3, 7]。如果用户想同时找到包含“夏天”和“海滩”的帖子,小S需要找出两个倒排链的交集,且将结果按照从大到小的顺序输出。现在,给定两个单词的倒排链数组 a 和 b,请你帮助小S找出同时包含这两个单词的帖子ID,并按从大到小的顺序返回结果。
测试样例
样例1:
输入:a = [1, 2, 3, 7], b = [2, 5, 7]
输出:[7, 2]
样例2:
输入:a = [1, 4, 8, 10], b = [2, 4, 8, 10]
输出:[10, 8, 4]
样例3:
输入:a = [3, 5, 9], b = [1, 4, 6]
输出:[]
样例4:
输入:a = [1, 2, 3], b = [1, 2, 3]
输出:[3, 2, 1]
我们可以先初始化双指针:创建两个指针 i 和 j,分别指向数组 a 和 b 的起始位置。
遍历数组,如果 a[i] == b[j],则将该元素添加到结果集中,并将两个指针都向前移动一位。如果 a[i] > b[j],则将指针 j 向前移动一位。如果 a[i] < b[j],则将指针 i 向前移动一位。处理剩余元素:由于数组已排序且我们只需要交集,所以当其中一个指针到达数组末尾时,循环即可结束。虽然题目要求结果按从大到小排序,但由于我们是从两个已排序的数组中取交集,且两个数组本身是按从小到大排序的,所以我们需要对结果集进行逆序排序。不过,在这个特定问题中,由于我们只需要找出交集,且不需要担心重复元素,我们可以直接收集交集元素,并在最后进行逆序排序。但是,为了优化性能并满足题目要求,我们可以在收集交集元素时使用一个列表,并在最后使用 sorted() 函数和 reverse=True 参数进行逆序排序。