2023-06-10 LeetCode每日一题(比较字符串最小字母出现频次)

2023-06-10每日一题

一、题目编号

1170. 比较字符串最小字母出现频次

二、题目链接

点击跳转到题目位置

三、题目描述

定义一个函数 f(s),统计 s 中**(按字典序比较)最小字母的出现频次** ,其中 s 是一个非空字符串。

例如,若 s = “dcce”,那么 f(s) = 2,因为字典序最小字母是 “c”,它出现了 2 次。

现在,给你两个字符串数组待查表 queries 和词汇表 words 。对于每次查询 queries[i] ,需统计 words 中满足 f(queries[i]) < f(W) 的 词的数目 ,W 表示词汇表 words 中的每个词。

请你返回一个整数数组 answer 作为答案,其中每个 answer[i] 是第 i 次查询的结果。

提示:

  • 1 <= queries.length <= 2000
  • 1 <= words.length <= 2000
  • 1 <= queries[i].length, words[i].length <= 10
  • queries[i][j]、words[i][j] 都由小写英文字母组成

四、解题代码

class Solution {
public:
    vector<int> numSmallerByFrequency(vector<string>& queries, vector<string>& words) {
        vector<int> res;
        int m = queries.size();
        int n = words.size();
        int f1[m];
        int f2[n];
        memset(f1, 0, sizeof(f1));
        memset(f2, 0, sizeof(f2));
        for(int i = 0; i < n; ++i){
            int hash[26];
            memset(hash, 0, sizeof(hash));
            for(int j = 0; j < words[i].size(); ++j){
                hash[words[i][j] - 'a']++;                
            }
            for(int j = 0; j < 26; ++j){
                if(hash[j] != 0){
                    f2[i] = hash[j];
                    break;
                }
            }
        }
        sort(f2, f2 + n);
        for(int i = 0; i < m; ++i){
            int hash[26];
            memset(hash, 0, sizeof(hash));
            for(int j = 0; j < queries[i].size(); ++j){
                hash[queries[i][j] - 'a']++;                
            }
            for(int j = 0; j < 26; ++j){
                if(hash[j] != 0){
                    f1[i] = hash[j];
                    break;
                }
            }
        }
        for(int i = 0; i < m; ++i){
            int left = 0; 
            int right = n-1;
            int ans = -1;
            while(left <= right){
                int mid = ((right - left) / 2 + left);
                if(f2[mid] > f1[i]){
                    ans = mid;
                    right = mid - 1;
                } else{
                    left = mid + 1;
                }
            }
            if(ans == -1){
                res.push_back(0);
            } else{
                ans = n - ans;
                res.push_back(ans);
            }
        }
    return res;   
    }
};

五、解题思路

(1) f1表示查询的最小字母出现频率,f2表示单词的最小字母出现频率。

(2) 用哈希表来统计字母数量,然后按照字典序从小到大进行遍历,遍历到存在的字母值就可以确定了。

(3) 利用二分查找来进行查询即可。

你可能感兴趣的:(LeetCode每日一题,leetcode,算法,数据结构)