1170. Compare Strings by Frequency of the Smallest Character

问题:

给定一组目标字符串数组 queries,和一个参照系字符串数组 words

求queries中的各个字符串:最小字符出现次数< words中最小字符出现次数的参照字符串的个数。

记字符串出现最小次数为函数fun

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.

  

解法:

首先求fun函数:

26个字符,计数算法:

计数遍历的同时,记录到当前为止最小字符 minc[0] & 最小字符出现的次数 minc[2]

初始化,最小字符为 26,出现次数为 0

 1     int fun(string &q){
 2         int alphbet[26]={0};
 3         vector<int> minc={26,0};
 4         for(char c:q){
 5             alphbet[c-'a']++;
 6             if(c-'a'<=minc[0]){
 7                 minc[0]=c-'a';
 8                 minc[1]=alphbet[c-'a'];
 9             }
10         }
11         return minc[1];
12     }

 

然后,总体看题意所求。

1.目标字符串数组 queries 的各个字符串 queries[i],会对应求出一个结果res[i]

那么首先,对 queries 的各个字符串,求出其fun的结果,计入queriesf

2.参照字符串数组 words :使用满足 >某个fun结果值 的字符串个数。

那么使用计数算法,对words的每个fun结果,进行计数。计入wordsfc

wordsfc[i] 记录fun结果为 i 的words中字符串个数。

再,所求为 > 某个计数值,我们再对wordsfc进行累计,

使得 wordsfc[i] 记录fun结果 >i 的words中字符串个数。

3.对每个queriesf,在wordsfc中找到所要求的个数,即可。

res[i]=wordsfc[queriesf[i]+1]

 

代码参考:

 1 class Solution {
 2 public:
 3     int fun(string &q){
 4         int alphbet[26]={0};
 5         vector<int> minc={26,0};
 6         for(char c:q){
 7             alphbet[c-'a']++;
 8             if(c-'a'<=minc[0]){
 9                 minc[0]=c-'a';
10                 minc[1]=alphbet[c-'a'];
11             }
12         }
13         return minc[1];
14     }
15     vector<int> numSmallerByFrequency(vector<string>& queries, vector<string>& words) {
16         vector<int> queriesf;//每个元素的f结果
17         vector<int> wordsfc(12,0);//长度为1~10的分别有几个
18         vector<int> res;
19         for(string &q:queries){
20             queriesf.push_back(fun(q));
21         }
22         for(string &w:words){
23             wordsfc[fun(w)]++;
24         }
25         for(int i=10; i>=0; i--){
26             wordsfc[i]+=wordsfc[i+1];
27         }
28         for(int qf:queriesf){
29             res.push_back(wordsfc[qf+1]);
30         }
31         return res;
32     }
33 };

 

posted @ 2020-07-05 09:33  habibah_chang  阅读(124)  评论(0编辑  收藏  举报