📜  门|门 IT 2007 |第 60 题(1)

📅  最后修改于: 2023-12-03 15:12:46.720000             🧑  作者: Mango

题目介绍

本题为 门|门 IT 2007 省选题,题号为第 60 题。该题目需要使用字符串处理的知识,并结合计算机科学基础进行分析和设计,考察了程序员的综合能力。

题目描述

已知两个字符串$s$和$t$,求用 $s$ 中的字符能否构成 $t$ 字符串。

输入格式

第一行输入一个整数$n$,表示接下来有$n$组数据。

每组数据包含两个字符串$s$和$t$,每个字符串的长度不超过$10^5$。

输出格式

对于每组数据,若 $s$ 中的字符能构成 $t$ 字符串,则输出"Yes",否则输出"No"。

样例输入
2
abcde
abc
abcdefghi
def
样例输出
Yes
No
题解思路

该题目可以使用字符串哈希算法进行求解,即将字符串映射成一个数字进行比对。首先对于$string$和$t$字符串分别预处理哈希值,然后使用一个标记数组$used$来记录在$string$中出现的字符;最后比较$t$中的每个字符是否都在$used$中出现过即可。

具体的实现细节可以通过以下步骤实现:

  1. 使用一个长为26的数组$hash[26]$,记录每个字符出现的个数;
  2. 遍历$t$字符串,将$hash$数组相关位置上的值减一;
  3. 遍历$string$字符串,将$hash$数组相关位置上的值加一;
  4. 判断$hash$数组中每一项是否都非负数,即可得出是否可行。

总时间复杂度为$O(n)$。

参考代码
public class Main {
    private static boolean check(String s, String t) {
        int[] hash = new int[26];
        for (int i = 0; i < t.length(); i++)
            hash[t.charAt(i) - 'a']--;
        for (int i = 0; i < s.length(); i++)
            hash[s.charAt(i) - 'a']++;
        for (int i = 0; i < 26; i++)
            if (hash[i] < 0)
                return false;
        return true;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        while (n-- > 0) {
            String s = sc.next();
            String t = sc.next();
            if (check(s, t))
                System.out.println("Yes");
            else
                System.out.println("No");
        }
    }
}

以上是Java版本的代码,也可以使用其他语言实现。