Count Unique Characters of All Substrings of a Given String | Leetcode 828 solution

 Let's define a function countUniqueChars(s) that returns the number of unique characters in s.

  • For example, calling countUniqueChars(s) if s = "LEETCODE" then "L""T""C""O""D" are the unique characters since they appear only once in s, therefore countUniqueChars(s) = 5.

Given a string s, return the sum of countUniqueChars(t) where t is a substring of s. The test cases are generated such that the answer fits in a 32-bit integer.

Notice that some substrings can be repeated so in this case you have to count the repeated ones too.

 

Example 1:

Input: s = "ABC"
Output: 10
Explanation: All possible substrings are: "A","B","C","AB","BC" and "ABC".
Every substring is composed with only unique letters.
Sum of lengths of all substring is 1 + 1 + 1 + 2 + 2 + 3 = 10

Example 2:

Input: s = "ABA"
Output: 8
Explanation: The same as example 1, except countUniqueChars("ABA") = 1.

Example 3:

Input: s = "LEETCODE"
Output: 92

 

Constraints:

  • 1 <= s.length <= 105
  • s consists of uppercase English letters only.

solution : 


class Solution {
public:
    int uniqueLetterString(string s) {

        unordered_map<char , vector<int>>map1;
        // for(int i =0 ; i < 26 ; i++)
        // { 
        //     char x = 'A' + i;
        //     map1[x].push_back(-1);
        // }
        int size = s.length();
        for(int i =0 ;i < size; i++)
        { 
            if(!map1.count(s[i]))
            {
                map1[s[i]].push_back(-1);
            }
            map1[s[i]].push_back(i);
        }
        for(auto &x : map1)
        {
            x.second.push_back(size);
        }
        int result = 0;
        for(auto &k : map1)
        { 
            int count =0;
            auto x = k.second;
            for(int i =1 ; i < x.size()-1 ; i++)
            {
                count += (x[i] - x[i-1])*(x[i+1] - x[i]);
            }
          result += count;
        }
       
        return result;
    }
};


Comments