问题:
给定一组目标字符串数组 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 };