Compare Strings by Frequency of the Smallest Character
Kind of a weird problem, but anywho, here it is: https://leetcode.com/problems/compare-strings-by-frequency-of-the-smallest-character/
Approach is simple:
Approach is simple:
- Build a frequency function (linear in the length of the input string)
- Build the frequency arrays for both queries and words
- Sort frequency words
- At this point you could do a Binary Search (ideal) or use a search for the first instance where the frequency query is larger than the frequency word, and halt (that's what I did)
Worked reasonably well. Code is below, cheers, ACC.
public class Solution
{
public int[] NumSmallerByFrequency(string[] queries, string[] words)
{
int[] queriesNumbers = new int[queries.Length];
int[] wordsNumbers = new int[words.Length];
for (int i = 0; i < queries.Length; i++)
{
queriesNumbers[i] = Frequency(queries[i]);
}
for (int i = 0; i < words.Length; i++)
{
wordsNumbers[i] = Frequency(words[i]);
}
Array.Sort(wordsNumbers);
int[] result = new int[queriesNumbers.Length];
for (int i = 0; i < queriesNumbers.Length; i++)
{
result[i] = 0;
for (int j = wordsNumbers.Length - 1; j >= 0 && wordsNumbers[j] > queriesNumbers[i]; j--)
{
result[i]++;
}
}
return result;
}
private int Frequency(string word)
{
char[] letters = new char[26];
int minIndex = 27;
int retValue = 0;
for (int i = 0; i < word.Length; i++)
{
letters[word[i] - 'a']++;
if (word[i] - 'a' <= minIndex)
{
minIndex = word[i] - 'a';
retValue = letters[minIndex];
}
}
return retValue;
}
}
I was solving this as part of the contest, so tried to be brief :)
ReplyDeleteimport bisect
class Solution:
def numSmallerByFrequency(self, queries: List[str], words: List[str]) -> List[int]:
def f(word: str) -> int:
word = sorted(word)
return bisect.bisect_right(word, word[0])
word_fs = sorted(f(word) for word in words)
return [
len(words) - bisect.bisect_right(word_fs, f(query)) for query in queries
]