Algorithm


Problem Name: 828. Count Unique Characters of All Substrings of a Given String

Problem Link: https://leetcode.com/problems/count-unique-characters-of-all-substrings-of-a-given-string/

Let's define a function countUniqueChars(s) that returns the number of unique characters on 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.

 

Code Examples

#1 Code Example with Javascript Programming

Code - Javascript Programming


const uniqueLetterString = function(s) {
  const n = s.length
  const arr = Array.from({ length: 26 }, () => Array(2).fill(-1))
  const A = 'A'.charCodeAt(0)
  let res = 0
  for(let i = 0; i  <  n; i++) {
    const idx = s.charCodeAt(i) - A
    res += (i - arr[idx][1]) * (arr[idx][1] - arr[idx][0])
    arr[idx] = [arr[idx][1], i]
  }
  
  for(let i = 0; i  <  26; i++) {
    res += (n - arr[i][1]) * (arr[i][1] - arr[i][0])
  }
  
  return res
};
Copy The Code & Try With Live Editor

Input

x
+
cmd
s = "ABC"

Output

x
+
cmd
10

#2 Code Example with Python Programming

Code - Python Programming


class Solution:
    def uniqueLetterString(self, S):
        index = {c: [-1, -1] for c in string.ascii_uppercase}
        res = 0
        for i, c in enumerate(S):
            k, j = index[c]
            res += (i - j) * (j - k)
            index[c] = [j, i]
        for c in index:
            k, j = index[c]
            res += (len(S) - j) * (j - k)
        return res % (10**9 + 7)
Copy The Code & Try With Live Editor

Input

x
+
cmd
s = "ABC"

Output

x
+
cmd
10
Advertisements

Demonstration


Previous
#827 Leetcode Making A Large Island Solution in C, C++, Java, JavaScript, Python, C# Leetcode
Next
#829 Leetcode Consecutive Numbers Sum Solution in C, C++, Java, JavaScript, Python, C# Leetcode