1170. Compare Strings by Frequency of the Smallest Character
Easy
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | class Solution { int getFreq(String word) { int[] freq = new int[26]; for(char c:word.toCharArray()) { freq[c-'a']++; } for(int i=0; i<26; ++i) { if(freq[i]!=0) return freq[i]; } return 0; } public int[] numSmallerByFrequency(String[] queries, String[] words) { int[] qF = new int[queries.length]; for(int i=0; i<queries.length; ++i) qF[i] = getFreq(queries[i]); int[] wF = new int[words.length]; for(int i=0; i<words.length; ++i) wF[i] = getFreq(words[i]); Arrays.sort(wF); int[] ret = new int[queries.length]; for(int i=0; i<queries.length; ++i){ int l = 0, r = wF.length-1; //find l as the first one with wF[l]>qF[i]; //l will also be the lenth of words whose frequence<=qF[i] while(l<=r) { int m = l + (r-l)/2; if(wF[m]<=qF[i]) { l = m+1; }else{ r = m-1; } } ret[i] = words.length - l; } return ret; } } |
No comments:
Post a Comment