1170. Compare Strings by Frequency of the Smallest Character #
题目 #
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.
题目大意 #
我们来定义一个函数 f(s),其中传入参数 s 是一个非空字符串;该函数的功能是统计 s 中(按字典序比较)最小字母的出现频次。
例如,若 s = “dcce”,那么 f(s) = 2,因为最小的字母是 “c”,它出现了 2 次。
现在,给你两个字符串数组待查表 queries 和词汇表 words,请你返回一个整数数组 answer 作为答案,其中每个 answer[i] 是满足 f(queries[i]) < f(W) 的词的数目,W 是词汇表 words 中的词。
提示:
- 1 <= queries.length <= 2000
- 1 <= words.length <= 2000
- 1 <= queries[i].length, words[i].length <= 10
- queries[i][j], words[i][j] 都是小写英文字母
解题思路 #
- 给出 2 个数组,
queries
和words
,针对每一个queries[i]
统计在words[j]
中满足f(queries[i]) < f(words[j])
条件的words[j]
的个数。f(string)
的定义是string
中字典序最小的字母的频次。 - 先依照题意,构造出
f()
函数,算出每个words[j]
的f()
值,然后排序。再依次计算queries[i]
的f()
值。针对每个f()
值,在words[j]
的f()
值中二分搜索,查找比它大的值的下标k
,n-k
即是比queries[i]
的f()
值大的元素个数。依次输出到结果数组中即可。
代码 #
package leetcode
import "sort"
func numSmallerByFrequency(queries []string, words []string) []int {
ws, res := make([]int, len(words)), make([]int, len(queries))
for i, w := range words {
ws[i] = countFunc(w)
}
sort.Ints(ws)
for i, q := range queries {
fq := countFunc(q)
res[i] = len(words) - sort.Search(len(words), func(i int) bool { return fq < ws[i] })
}
return res
}
func countFunc(s string) int {
count, i := [26]int{}, 0
for _, b := range s {
count[b-'a']++
}
for count[i] == 0 {
i++
}
return count[i]
}