Skip to content

Latest commit

 

History

History
 
 

1170. Compare Strings by Frequency of the Smallest Character

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

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.

Related Topics:
Array, String

Solution 1.

// OJ: https://leetcode.com/problems/compare-strings-by-frequency-of-the-smallest-character/
// Author: github.com/lzl124631x
// Time: O(W*Q)
// Space: O(W)
class Solution {
    int frequency(string &s) {
        int ch = 'z', cnt = 0;
        for (char c : s) {
            if (c < ch) {
                cnt = 1;
                ch = c;
            } else if (c == ch) ++cnt;
        }
        return cnt;
    }
public:
    vector<int> numSmallerByFrequency(vector<string>& Q, vector<string>& W) {
        vector<int> F(W.size()), ans;
        for (int i = 0; i < W.size(); ++i) F[i] = frequency(W[i]);
        for (auto &s : Q) {
            int cnt = 0, f = frequency(s);
            for (int i = 0; i < W.size(); ++i) cnt += F[i] > f;
            ans.push_back(cnt);
        }
        return ans;
    }
};

Solution 2.

// OJ: https://leetcode.com/problems/compare-strings-by-frequency-of-the-smallest-character/
// Author: github.com/lzl124631x
// Time: O(W + Q)
// Space: O(1)
class Solution {
    int frequency(string &s) {
        int ch = 'z', cnt = 0;
        for (char c : s) {
            if (c < ch) {
                cnt = 1;
                ch = c;
            } else if (c == ch) ++cnt;
        }
        return cnt;
    }
public:
    vector<int> numSmallerByFrequency(vector<string>& Q, vector<string>& W) {
        vector<int> F(11), ans;
        for (int i = 0; i < W.size(); ++i) F[frequency(W[i])]++;
        for (int i = 1; i < 11; ++i) F[i] += F[i - 1];
        for (auto &s : Q) ans.push_back(W.size() - F[frequency(s)]);
        return ans;
    }
};