以 "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; } }; ```