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.
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; } }