Thursday, September 3, 2020

LeetCode [1170] Compare Strings by Frequency of the Smallest Character

 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