以 "LEETCODE" 为例
一个新字符 $s_i$ 的加入,对之前子串的影响如下
例如 $i = 7$ 也就是末尾的 `E` 加入时,之前不包含 `E` 的子串都会 $+ 1$ ,比如 `D`、`OD`、`COD`、`TCOD`,有多少个不含 $s_i$ 的子串呢,直到上一个 $s_i$ 的下标之后直到 $i$每个位置起始的子串都是,设上一个 $s_i$的下标为 $j$,则有 $i - j - 1$ 个子串增加了 $1$,**同时 $s_i$ 作为一个单独子串也算作 $1$**
对所有包含一个 `E` 的子串,`countUniqueChars(s)`的值会 $-1$,比如`countUniqueChars("ETCOD") = 5`,加上`E`后 `countUniqueChars("ETCODE") = 4`,有多少个含有一个 $s_i$ 的子串呢,那就是包含上一个 $s_i$ 下标 $j$但不包含上上一个 $s_i$ 下标 $k$ 的子串,这样的子串有 $k - i$个
对所有包含多个 `E` 的子串,加上 $s_i$ 的值不变
由此可以总结出,加上 $s_i$,总和增加了 $i - last(s_i)$,减少了 $last(s_i) - lastlast(s_i)$,也就是
$
i - 2 * last(s_i) + lastlast(s_i)
$
```cpp
class Solution {
public:
int uniqueLetterString(string s) {
int last[26], last_last[26];
memset(last, -1, sizeof(last));
memset(last_last, -1, sizeof(last_last));
int ans = 0, total = 0;
for (auto i{0}; i < s.size(); ++i) {
auto c = s[i] - 'A';
total += (i - 2 * last[c] + last_last[c]);
ans += total;
last_last[c] = last[c];
last[c] = i;
}
return ans;
}
};
```