📅  最后修改于: 2023-12-03 15:28:39.090000             🧑  作者: Mango
本题为 GATE CS 2021 年考试的第 62 题,考查了程序员的数据结构和算法能力。
给出两个字符串 S 和 T,要求从 S 中删除一些字符,使得剩下的字符串正好是 T。例如,如果字符串 S 为 "leetcode",字符串 T 为 "code",那么一个可能的解决方法是删除字符串 S 中的两个 'e',得到新的字符串 "lcod",正好是字符串 T。
编写一个函数 int minSteps(string S, string T)
,其中 S 和 T 是两个字符串,函数返回从 S 中删除字符的最小操作数,使得剩下的字符串正好是 T。
假设 S 和 T 的长度分别为 n 和 m,以及 1≤n≤1000,1≤m≤100。
输入:
S = "leetcode", T = "code"
输出:
2
说明:
因为 "leetcode" 到 "code" 需要删除两个字符 'e'。
这是一个字符串匹配的问题,通过观察题目可以发现,可以将问题转换为求 S 中有多少个字符不在 T 中。因此,我们可以先统计出 S 和 T 中每个字符出现的次数,然后计算它们之差的绝对值。
假设 S 中所有字符在 T 中都出现了,那么在 S 中找到 T 的第一个字符,然后从这个字符开始遍历字符串,如果后面的字符也在 T 中出现过,那么我们就删除它,否则我们就将其保留。
从以上的分析可以看出,我们需要两个辅助数组来存储字符的出现次数,分别对应 S 和 T。然后,我们就可以用上述算法来解决问题。
int minSteps(string S, string T) {
int sCount[256] = {0}, tCount[256] = {0};
for (char c : S) {
sCount[c]++;
}
for (char c : T) {
tCount[c]++;
}
int ans = 0;
for (int i = 0; i < 256; i++) {
ans += abs(sCount[i] - tCount[i]);
}
return ans / 2;
}
统计 S 和 T 中每个字符出现的次数需要 O(n + m) 的时间,计算它们之差的绝对值需要 O(1) 的时间,因此总时间复杂度为 O(n + m)。
我们需要两个大小为 256 的辅助数组来存储 S 和 T 中每个字符出现的次数,因此总空间复杂度为 O(1)。