string
two pointers
]
Leetcode 0828 Count Unique Characters of All Substrings of a Given String
Problem statement
https://leetcode.com/problems/count-unique-characters-of-all-substrings-of-a-given-string/
Solution
Let us inverse this problem and do it in the following way: for every symbol we will count number of substrings, for which it is unique. For example for word LEETCODE
for symbol E
we have positions 1, 2, 7
. What we need to do: add also positions -1
and n
here, where n
is length of string, so we have -1,1, 2, 7, 8
now, evaluate differences between adjacent elements: 2, 1, 5, 1
and now evaluate sum of products of adjacent elements: 2 x 1 + 1 x 5 + 5 x 1 = 12
. Why so? Because for each index we can go several place to the left and several places to the right.
Complexity
Time complexity is O(n)
, because we deal with each index only once, space complexity is O(n)
as well.
Code
class Solution:
def uniqueLetterString(self, s):
positions = defaultdict(list)
n, ans = len(s), 0
for i, elem in enumerate(s):
positions[elem].append(i)
for letter, pos in positions.items():
diffs = list(x-y for x,y in zip(pos + [n], [-1] + pos))
ans += sum(x*y for x,y in zip(diffs[1:], diffs[:-1]))
return ans % (10**9 + 7)