LeetCode 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 次查询的结果。

思路:转化成二分查找问题,闭区间 > 问题。

代码

java 复制代码
class Solution {
    public int[] numSmallerByFrequency(String[] queries, String[] words) {
        int n = words.length;
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = func(words[i]);
        }
        Arrays.sort(nums);
        int m = queries.length;
        int[] ans = new int[m];
        for (int j = 0; j < m; j++) {
            int target = func(queries[j]);
            int start = lowerBound(nums, target + 1);
            ans[j] = n - start;
        }
        return ans;
    }

    private int lowerBound(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }

    private int func(String s) {
        int[] cnt = new int[26];
        for (int i = 0; i < s.length(); i++) {
            cnt[s.charAt(i) - 'a']++;
        }
        for (int c : cnt) {
            if (c > 0) {
                return c;
            }
        }
        return 0;
    }
}

性能

时间复杂度o( (m+n)logn )

空间复杂度o(m + n)