LeetCode 1170. Compare Strings by Frequency of the Smallest Character Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1170. Compare Strings by Frequency of the Smallest Character

Description

Let the function f(s) be the frequency of the lexicographically smallest character in a non-empty string s. For example, if s = "dcce" then f(s) = 2 because the lexicographically smallest character is 'c', which has a frequency of 2.

You are given an array of strings words and another array of query strings queries. For each query queries[i], count the number of words in words such that f(queries[i]) < f(W) for each W in words.

Return an integer array answer, where each answer[i] is the answer to the ith query.

 

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] consist of lowercase English letters.

Solutions

Solution 1: Sorting + Binary Search

First, according to the problem description, we implement a function f(s), which returns the frequency of the smallest letter in the string s in lexicographical order.

Next, we calculate f(w) for each string w in words, sort them, and store them in an array nums.

Then, we traverse each string q in queries, and binary search in nums for the first position i that is greater than f(q). Then, the elements at index i and after in nums all satisfy f(q) < f(W), so the answer to the current query is n - i.

The time complexity is O((n + q) × M), and the space complexity is O(n). Here, n and q are the lengths of the arrays words and queries respectively, and M is the maximum length of the strings.

PythonJavaC++GoTypeScript
class Solution: def numSmallerByFrequency(self, queries: List[str], words: List[str]) -> List[int]: def f(s: str) -> int: cnt = Counter(s) return next(cnt[c] for c in ascii_lowercase if cnt[c]) n = len(words) nums = sorted(f(w) for w in words) return [n - bisect_right(nums, f(q)) for q in queries](code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !