class Solution:
    def uniqueLetterString(self, s: str) -> int:
        """ tc O(N)  sc O(N)  two rounds
        main idea: check left and right position, cnt = (cur-leftPos) * (rightPos - cur)
        1. for each char, save all the index appeared in the s 
        2. loop through all the charector, loop through all the index and get it's left and right position 
        3. Add count onto res with mode  
        """
        
        d = collections.defaultdict(list)
        for i,c in enumerate(s):
            d[c].append(i)
        
        res = 0
        for each in d.keys():
            #size = len(d[each])
            lst = d[each]
            for idx, cur in enumerate(lst):
                leftPos = lst[idx - 1] if idx != 0 else -1
                rightPos = lst[idx + 1] if idx != len(lst)-1 else len(s)
                res = res + (cur-leftPos) *(rightPos - cur)
        return res 
class Solution:
    def uniqueLetterString(self, s: str) -> int:
        """ tc O(N)  sc O(1) one rounds
        main idea: save last two appeared index for current char to save space
        """
        
        d = {c:[-1,-1] for c in string.ascii_uppercase}
        res = 0 
        for i,c in enumerate(s):
            fst, snd = d[c]
            res = res + (snd-fst) * (i-snd)
            d[c] = [snd,i] 
            
        for each in d.keys():
            fst, snd  = d[each]
            res = res + (snd-fst) *(len(s)-snd)
        return res