题目
解法
- 跟Sum of Subarray Minimums有点像,那个题目是找前面和后面第一个比现在小的值,这道题是看前面和后面第一个和现在想同的字符
- 核心思想:对于每个字符,数出这个字符作为unique字符贡献了多少次,比如对于BAB,那么A在BA,A,AB,ABA这些substring都对答案贡献了1
class Solution:
def uniqueLetterString(self, s: str) -> int:
char2ind_map = {}
for i,c in enumerate(s):
if c not in char2ind_map:
char2ind_map[c] = [-1]
char2ind_map[c].append(i)
# print(char2ind_map)
for c in char2ind_map:
char2ind_map[c].append(len(s))
ans = 0
for c,ind_list in char2ind_map.items():
for j in range(1,len(ind_list)-1):
left = ind_list[j] - ind_list[j-1]
right = ind_list[j+1] - ind_list[j]
ans += left*right
return ans
参考: https://leetcode.com/problems/count-unique-characters-of-all-substrings-of-a-given-string/discuss/128952/JavaC%2B%2BPython-One-pass-O(N)