1、数学
我们可以使用哈希表来记录字符串中每个字符出现的位置。考虑到子字符串必须是连续的,对于字符 s [ j ] s[j] s[j]而言,假设其上一次出现的位置是 i i i,下一次出现的位置是 k k k,显然我们可获得的字符串个数为 ( k − j ) × ( j − i ) (k-j) \times (j-i) (k−j)×(j−i)。我们可以遍历哈希表中的每一个字符,获得仅包含当前一个字符的子字符串并累加即可获得最终结果。
class Solution {
public:
int uniqueLetterString(string s) {
int n = s.size(), res = 0;
unordered_map<char, vector<int>> hs;
for (int i = 0; i < n; ++i) {
hs[s[i]].emplace_back(i);
}
for (auto &&item: hs) {
item.second.insert(item.second.begin(), -1);
item.second.emplace_back(n);
for (int i = 1; i < item.second.size() - 1; ++i) {
res += (item.second[i] - item.second[i - 1]) * (item.second[i + 1] - item.second[i]);
}
}
return res;
}
};