828. 统计子串中的唯一字符 - 力扣(LeetCode)
var uniqueLetterString = function(s) {
const index = new Map();
for (let i = 0; i < s.length; i++) {
const c = s[i];
if (!index.has(c)) {
index.set(c, []);
index.get(c).push(-1);
}
index.get(c).push(i);
}
let res = 0;
for (const [_, arr] of index.entries()) {
arr.push(s.length);
for (let i = 1; i < arr.length - 1; i++) {
res += (arr[i] - arr[i - 1]) * (arr[i + 1] - arr[i]);
}
}
return res;
};
执行结果:通过
执行用时:96 ms, 在所有 JavaScript 提交中击败了70.00%的用户
内存消耗:48.6 MB, 在所有 JavaScript 提交中击败了45.00%的用户
通过测试用例:76 / 76
设字符c位于[left, right]中的idx且c唯一, 那么c出现的次数为它左边包含它的个数乘它右边包含它的个数 [即(idx + 1 - left) * (right + 1 - left)]。
所以我们只需要统计每个字符出现的所有间隔坐标即可。
function uniqueLetterString(s: string): number {
const dict: Map<string, Array<number>> = new Map<string, Array<number>>()
for (let i = 0; i < s.length; i++) {
const key: string = s.substr(i, 1)
if (dict.has(key)) {
dict.get(key).push(i)
} else {
dict.set(key, [-1, i])
}
}
let ans: number = 0
dict.forEach((value: number[]) => {
value.push(s.length)
for (let i = 1; i < value.length - 1; i++) {
ans += (value[i] - value[i - 1]) * (value[i + 1] - value[i])
}
})
return ans
};
参考链接
统计子串中的唯一字符 - 统计子串中的唯一字符 - 力扣(LeetCode)
【爪哇缪斯】图解LeetCode - 统计子串中的唯一字符 - 力扣(LeetCode)
【宫水三叶】常规乘法原理运用题 - 统计子串中的唯一字符 - 力扣(LeetCode)
[[Python/Java/TypeScript/Go] 数学 - 统计子串中的唯一字符 - 力扣(LeetCode)](