828. Count Unique Characters of All Substrings of a Given String
Description
Let's define a function countUniqueChars(s)
that returns the number of unique characters in s
.
- For example, calling
countUniqueChars(s)
ifs = "LEETCODE"
then"L"
,"T"
,"C"
,"O"
,"D"
are the unique characters since they appear only once ins
, thereforecountUniqueChars(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.
Solutions
Solution 1: Calculate the Contribution of Each Character
For each character \(c_i\) in the string \(s\), when it appears only once in a substring, it contributes to the count of unique characters in that substring.
Therefore, we only need to calculate for each character \(c_i\), how many substrings contain this character only once.
We use a hash table or an array \(d\) of length \(26\), to store the positions of each character in \(s\) in order of index.
For each character \(c_i\), we iterate through each position \(p\) in \(d[c_i]\), find the adjacent positions \(l\) on the left and \(r\) on the right, then the number of substrings that meet the requirements by expanding from position \(p\) to both sides is \((p - l) \times (r - p)\). We perform this operation for each character, add up the contributions of all characters, and get the answer.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Here, \(n\) is the length of the string \(s\).
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|