Let's define a function f(s)
over a non-empty string s
, which calculates the frequency of the smallest character in s
. For example, if s = "dcce"
then f(s) = 2
because the smallest character is "c"
and its frequency is 2.
Now, given string arrays queries
and words
, return an integer array answer
, where each answer[i]
is the number of words such that f(queries[i])
< f(W)
, where W
is a word in words
.
Example 1:
Input: queries = ["cbd"], words = ["zaaaz"] Output: [1] Explanation: On the first query we have f("cbd") = 1, f("zaaaz") = 3 so f("cbd") < f("zaaaz").
Example 2:
Input: queries = ["bbb","cc"], words = ["a","aa","aaa","aaaa"] Output: [1,2] Explanation: On the first query only f("bbb") < f("aaaa"). On the second query both f("aaa") and f("aaaa") are both > f("cc").
Constraints:
1 <= queries.length <= 2000
1 <= words.length <= 2000
1 <= queries[i].length, words[i].length <= 10
queries[i][j]
,words[i][j]
are English lowercase letters.
比较字符串最小字母出现频次。
我们来定义一个函数 f(s),其中传入参数 s 是一个非空字符串;该函数的功能是统计 s 中(按字典序比较)最小字母的出现频次。
例如,若 s = "dcce",那么 f(s) = 2,因为最小的字母是 "c",它出现了 2 次。
现在,给你两个字符串数组待查表 queries 和词汇表 words,请你返回一个整数数组 answer 作为答案,其中每个 answer[i] 是满足 f(queries[i]) < f(W) 的词的数目,W 是词汇表 words 中的词。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compare-strings-by-frequency-of-the-smallest-character
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题暴力解不难想,但是暴力解是O(n^2)级别的,很显然会超时。我这里提供一个二分法的思路。这道题其实不是很难但是题意写的不是很清楚,f函数 其实需要输出的是字典序最小的出现次数不为0的字母的出现次数。
首先根据题意我们去实现 f函数 ,这个不是很难。我们创建两个临时数组 int[] q 和 int[] w ,分别把queries和words里面的每个单词跑过F函数的结果存储起来,同时我们把 int[] w 排序,这样找最后结果的时候可以用到二分法。
时间O(nlogn)
空间O(n)
Java实现
1 class Solution { 2 public int[] numSmallerByFrequency(String[] queries, String[] words) { 3 int[] q = new int[queries.length]; 4 int[] w = new int[words.length]; 5 for (int i = 0; i < q.length; i++) { 6 q[i] = helper(queries[i]); 7 } 8 for (int j = 0; j < w.length; j++) { 9 w[j] = helper(words[j]); 10 } 11 Arrays.sort(w); 12 int[] res = new int[q.length]; 13 for (int i = 0; i < q.length; i++) { 14 int left = 0; 15 int right = w.length - 1; 16 while (left <= right) { 17 int mid = left + (right - left) / 2; 18 if (q[i] >= w[mid]) { 19 left = mid + 1; 20 } else { 21 right = mid - 1; 22 } 23 } 24 res[i] = w.length - left; 25 } 26 return res; 27 } 28 29 private int helper(String s) { 30 int[] count = new int[26]; 31 for (int i = 0; i < s.length(); i++) { 32 count[s.charAt(i) - 'a']++; 33 } 34 35 for (int i = 0; i < 26; i++) { 36 if (count[i] != 0) { 37 return count[i]; 38 } 39 } 40 return 0; 41 } 42 }