A character is unique in string ​​S​​ if it occurs exactly once in it.

For example, in string ​​S = "LETTER"​​​, the only unique characters are ​​"L"​​​ and ​​"R"​​.

Let's define ​​UNIQ(S)​​​ as the number of unique characters in string ​​S​​.

For example, ​​UNIQ("LETTER") =  2​​.

Given a string ​​S​​​ with only uppercases, calculate the sum of ​​UNIQ(substring)​​​ over all non-empty substrings of ​​S​​.

If there are two or more equal substrings at different positions in ​​S​​, we consider them different.

Since the answer can be very large, return the answer modulo ​​10 ^ 9 + 7​​.

 

Example 1:

Input: "ABC"
Output: 10
Explanation: All possible substrings are: "A","B","C","AB","BC" and "ABC".
Evey substring is composed with only unique letters.
Sum of lengths of all substring is 1 + 1 + 1 + 2 + 2 + 3 = 10

Example 2:

Input: "ABA"
Output: 8
Explanation: The same as example 1, except uni("ABA") = 1.

 

Note: ​​0 <= S.length <= 10000​​.

题解:

last记录每个字母最后出现的位置,num记录每个字母对于结果贡献的长度,cur记录当前位置为结果的子串所有不重复字符个数。

​https://leetcode.com/problems/unique-letter-string/discuss/129021/O(N)-Java-Solution-DP-Clear-and-easy-to-Understand​

class Solution {
public:
int uniqueLetterString(string S) {
int mod = 10e9 + 7;
int n = S.length();
vector<int> last(26, 0);
vector<long long> num(26, 0);
long long cur = 0, res = 0;
for (int i = 0; i < n; i++) {
int k = S[i] - 'A';
cur = (cur - num[k]);
num[k] = (i - last[k] + 1);
cur = (cur + num[k]) % mod;
last[k] = i + 1;
res = (res + cur) % mod;
}
return res % mod;
}
};