📜  门| GATE-CS-2001 |问题17(1)

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

问题描述:

有一个字符数组arr,里面存放了多个字符串。编写一个函数,接收该字符数组和一个字符串str作为参数,返回一个整数代表在arr中有多少个字符串与str具有相同的字符种类和数目。

函数原型:
int countStrings(char arr[][20], int n, char *str);
输入参数解释:
  • char arr[][20]:字符数组,二维数组中的每个元素都是一个长度不超过19的字符串。1 <= n <= 100,即arr数组的行数不超过100。
  • int n:字符数组的行数。
  • char *str:长度不超过19的字符串。
输出参数解释:
  • int:返回一个整数代表在arr中有多少个字符串与str具有相同的字符种类和数目。
示例:
输入:
char arr[][20] = {"hello", "world", "leetcode", "ooolleoooxoo", "php"};
int n = 5;
char str[] = "ollx";
输出:2

分析:

可以遍历数组,分别判断每个字符串和str的字符种类和数量是否相等,如果相等,则计数器加1。

因为对每个元素都需要遍历一遍整个字符串,所以时间复杂度为$O(nm)$,其中n为字符数组的行数,m为字符数组中字符串的最长长度,20 in this case。

代码实现:
int countStrings(char arr[][20], int n, char *str)
{
    int count = 0;

    for (int i = 0; i < n; i++)
    {
        int cnt[26] = {0}, len = strlen(arr[i]);
        bool isMatch = true;

        for (int j = 0; j < len; j++)
        {
            cnt[arr[i][j] - 'a']++;
        }

        for (int j = 0; j < strlen(str); j++)
        {
            if (cnt[str[j] - 'a']-- == 0)
            {
                isMatch = false;
                break;
            }
        }

        if (isMatch)
        {
            count++;
        }
    }

    return count;
}