📜  门| GATE CS 2021 |设置 2 |第 62 题(1)

📅  最后修改于: 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)。