1170. Compare Strings by Frequency of the Smallest Character
Tags: ‘Array’, ‘String’, ‘Binary Search’
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.
Solution
63% 100% ``java public int[] numSmallerByFrequency(String[] queries, String[] words) { int[] q = new int[queries.length]; int[] w = new int[words.length];
// populate q and w
for (int i = 0; i < queries.length; i++) {
q[i] = func(queries[i]);
}
for (int j = 0; j < words.length; j++) {
w[j] = func(words[j]);
}
Arrays.sort(w);
// Binary search to find first element >
int[] result = new int[queries.length];
for (int i = 0; i < q.length; i++) {
int l = 0, r = w.length - 1;
while (l <= r) {
int m = l + (r - l) / 2;
if (w[m] <= q[i]) {
l = m + 1;
} else {
r = m - 1;
}
}
result[i] = w.length - l;
}
return result; }
private int func(String s) { if (s == null || s.length() == 0) return -1; char min = Character.MAX_VALUE; int count = 1; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c < min) { min = c; count = 1; } else if (c == min) { count++; } } return count; } ```