Count Unique Characters of All Substrings of a Given String

hard string math contribution

Problem

Define countUniqueChars(s) as the number of characters appearing exactly once in s. Return the sum of countUniqueChars(t) for every substring t of s.

Inputs = "ABC"
Output10
All 6 substrings contribute, totaling 10 unique-char occurrences.

def uniqueLetterString(s):
    last = {}; prev = {}
    res = 0
    for i, c in enumerate(s):
        p = prev.get(c, -1)
        l = last.get(c, -1)
        res += (l - p) * (i - l)
        prev[c] = l
        last[c] = i
    n = len(s)
    for c, l in last.items():
        p = prev.get(c, -1)
        res += (l - p) * (n - l)
    return res
function uniqueLetterString(s) {
  const last = new Map(), prev = new Map();
  let res = 0;
  for (let i = 0; i < s.length; i++) {
    const c = s[i];
    const p = prev.has(c) ? prev.get(c) : -1;
    const l = last.has(c) ? last.get(c) : -1;
    res += (l - p) * (i - l);
    prev.set(c, l);
    last.set(c, i);
  }
  const n = s.length;
  for (const [c, l] of last) {
    const p = prev.has(c) ? prev.get(c) : -1;
    res += (l - p) * (n - l);
  }
  return res;
}
import java.util.*;
class Solution {
  public int uniqueLetterString(String s) {
    int[] last = new int[26], prev = new int[26];
    Arrays.fill(last, -1); Arrays.fill(prev, -1);
    int res = 0, n = s.length();
    for (int i = 0; i < n; i++) {
      int c = s.charAt(i) - 'A';
      res += (last[c] - prev[c]) * (i - last[c]);
      prev[c] = last[c];
      last[c] = i;
    }
    for (int c = 0; c < 26; c++) {
      res += (last[c] - prev[c]) * (n - last[c]);
    }
    return res;
  }
}
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
    int uniqueLetterString(string s) {
        vector<int> last(26, -1), prev(26, -1);
        int res = 0, n = s.size();
        for (int i = 0; i < n; i++) {
            int c = s[i] - 'A';
            res += (last[c] - prev[c]) * (i - last[c]);
            prev[c] = last[c];
            last[c] = i;
        }
        for (int c = 0; c < 26; c++)
            res += (last[c] - prev[c]) * (n - last[c]);
        return res;
    }
};
Time: O(n) Space: O(1)