Skip to content

3325. Count Substrings With K-Frequency Characters I

Given a string s and an integer k, return the total number of

substrings

of s where at least one character appears at least k times.

Example 1:

Input: s = "abacb", k = 2

Output: 4

Explanation:

The valid substrings are:

  • "aba" (character 'a' appears 2 times).
  • "abac" (character 'a' appears 2 times).
  • "abacb" (character 'a' appears 2 times).
  • "bacb" (character 'b' appears 2 times).

Example 2:

Input: s = "abcde", k = 1

Output: 15

Explanation:

All substrings are valid because every character appears at least once.

Constraints:

  • 1 <= s.length <= 3000
  • 1 <= k <= s.length
  • s consists only of lowercase English letters.

Solution:

class Solution {
    public int numberOfSubstrings(String s, int k) {
        int result = 0;
        // Map<Character, Integer> map = new HashMap<>();
        /*

        substrings of s 

        at least one character 

        abacb
        s
            f

        */

        if (k == 1){
            return (1 + s.length())*s.length()/2;
        }


        /*
                0 1 2 3 4
                a b a c b
                  i 
                    j
                <a, 2>
                <b, 1>



         */

        for (int i = 0; i < s.length() - 1; i++){
            char start = s.charAt(i); // a 
            Map<Character, Integer> map = new HashMap<>();
            map.put(start, map.getOrDefault(start, 0) + 1);
            for (int j = i + 1; j < s.length(); j++){
                char next = s.charAt(j); // b
                map.put(next, map.getOrDefault(next, 0) + 1);

                if (map.get(next) == k){ // 2
                    result = result + (s.length() - j);
                    // 0 + (5 - 2) = 0 + 3
                    break;
                }
            }
        }


        return result;
    }
}