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.
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
Input: s = "ABA" Output: 8 Explanation: The same as example 1, except countUniqueChars("ABA") = 1.
Input: s = "LEETCODE" Output: 92
1 <= s.length <= 105
s
consists of uppercase English letters only.
impl Solution {
pub fn unique_letter_string(s: String) -> i32 {
let s = s.as_bytes();
let mut indices = vec![vec![-1]; 26];
let mut ret = 0;
for i in 0..s.len() {
indices[(s[i] - b'A') as usize].push(i as i32);
}
for i in 0..26 {
indices[i].push(s.len() as i32);
for j in 1..indices[i].len() - 1 {
ret += (indices[i][j] - indices[i][j - 1]) * (indices[i][j + 1] - indices[i][j]);
}
}
ret
}
}