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 <= 20001 <= words.length <= 20001 <= queries[i].length, words[i].length <= 10queries[i][j],words[i][j]are English lowercase letters.
Straight forward solution O(q * w)
class Solution {
public int[] numSmallerByFrequency(String[] queries, String[] words) {
int[] result = new int[queries.length];
for (int i = 0 ; i < queries.length; i ++){
int score = s(queries[i]);
for (String w : words){
if (s(w) > score){
result[i] ++;
}
}
}
return result;
}
public static int s(String s) {
char min = 'z';
char[] ca = s.toCharArray();
for(char c : ca){
if (c < min){
min = c;
}
if (c == 'a'){
break;
}
}
int r = 0;
for(char c : ca){
if (c == min)
r ++;
}
return r;
}
}
Optimized solution O (q + w)
since we have 1 <= queries[i].length, words[i].length <= 10
which means query will have only 10 possible values (limited), so for the result.
so we can use counting.
class Solution {
public int[] numSmallerByFrequency(String[] queries, String[] words) {
int[] freqCounter = new int[11];
int[] result = new int[queries.length];
for (int i = 0; i < words.length; i++) {
int freq = s(words[i]);
freqCounter[freq]++;
}
for (int i = 1; i < freqCounter.length; i++) {
freqCounter[i] += freqCounter[i - 1];
}
for (int i = 0; i < queries.length; i++) {
int freq = s(queries[i]);
result[i] = words.length - freqCounter[freq];
}
return result;
}
public static int s(String s) {
char min = 'z';
int r = 0;
char[] ca = s.toCharArray();
for(char c : ca){
if (c < min){
r = 1;
min = c;
} else if(c == min) {
r ++;
}
}
return r;
}
}