Skip to content

Commit 9d6b14c

Browse files
committed
feat: add solutions to lc problem: No.0828
No.0828.Count Unique Characters of All Substrings of a Given String
1 parent 24b62a9 commit 9d6b14c

File tree

7 files changed

+224
-7
lines changed

7 files changed

+224
-7
lines changed

solution/0800-0899/0828.Count Unique Characters of All Substrings of a Given String/README.md

+80-1
Original file line numberDiff line numberDiff line change
@@ -54,22 +54,101 @@
5454

5555
<!-- 这里可写通用的实现逻辑 -->
5656

57+
**方法一:计算每个字符的贡献**
58+
59+
对于字符串 `s` 的每个字符 $c_i$,当它在某个子字符串中仅出现一次时,它会对这个子字符串统计唯一字符时有贡献。只需对每个字符 $c_i$,计算有多少子字符串仅包含该字符一次即可。
60+
61+
时间复杂度 $O(n)$,其中 $n$ 为字符串 `s` 的长度。
62+
5763
<!-- tabs:start -->
5864

5965
### **Python3**
6066

6167
<!-- 这里可写当前语言的特殊实现逻辑 -->
6268

6369
```python
64-
70+
class Solution:
71+
def uniqueLetterString(self, s: str) -> int:
72+
d = defaultdict(list)
73+
for i, c in enumerate(s):
74+
d[c].append(i)
75+
ans = 0
76+
for v in d.values():
77+
v = [-1] + v + [len(s)]
78+
for i in range(1, len(v) - 1):
79+
ans += (v[i] - v[i - 1]) * (v[i + 1] - v[i])
80+
return ans
6581
```
6682

6783
### **Java**
6884

6985
<!-- 这里可写当前语言的特殊实现逻辑 -->
7086

7187
```java
88+
class Solution {
89+
public int uniqueLetterString(String s) {
90+
List<Integer>[] d = new List[26];
91+
for (int i = 0; i < 26; ++i) {
92+
d[i] = new ArrayList<>();
93+
d[i].add(-1);
94+
}
95+
for (int i = 0; i < s.length(); ++i) {
96+
d[s.charAt(i) - 'A'].add(i);
97+
}
98+
int ans = 0;
99+
for (var v : d) {
100+
v.add(s.length());
101+
for (int i = 1; i < v.size() - 1; ++i) {
102+
ans += (v.get(i) - v.get(i - 1)) * (v.get(i + 1) - v.get(i));
103+
}
104+
}
105+
return ans;
106+
}
107+
}
108+
```
109+
110+
### **C++**
111+
112+
```cpp
113+
class Solution {
114+
public:
115+
int uniqueLetterString(string s) {
116+
vector<vector<int>> d(26, {-1});
117+
for (int i = 0; i < s.size(); ++i) {
118+
d[s[i] - 'A'].push_back(i);
119+
}
120+
int ans = 0;
121+
for (auto& v : d) {
122+
v.push_back(s.size());
123+
for (int i = 1; i < v.size() - 1; ++i) {
124+
ans += (v[i] - v[i - 1]) * (v[i + 1] - v[i]);
125+
}
126+
}
127+
return ans;
128+
}
129+
};
130+
```
72131
132+
### **Go**
133+
134+
```go
135+
func uniqueLetterString(s string) int {
136+
d := make([][]int, 26)
137+
for i := range d {
138+
d[i] = []int{-1}
139+
}
140+
for i, c := range s {
141+
d[c-'A'] = append(d[c-'A'], i)
142+
}
143+
ans := 0
144+
for _, v := range d {
145+
v = append(v, len(s))
146+
for i := 1; i < len(v)-1; i++ {
147+
ans += (v[i] - v[i-1]) * (v[i+1] - v[i])
148+
}
149+
}
150+
return ans
151+
}
73152
```
74153

75154
### **...**

solution/0800-0899/0828.Count Unique Characters of All Substrings of a Given String/README_EN.md

+74-1
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,86 @@ Sum of lengths of all substring is 1 + 1 + 1 + 2 + 2 + 3 = 10
5555
### **Python3**
5656

5757
```python
58-
58+
class Solution:
59+
def uniqueLetterString(self, s: str) -> int:
60+
d = defaultdict(list)
61+
for i, c in enumerate(s):
62+
d[c].append(i)
63+
ans = 0
64+
for v in d.values():
65+
v = [-1] + v + [len(s)]
66+
for i in range(1, len(v) - 1):
67+
ans += (v[i] - v[i - 1]) * (v[i + 1] - v[i])
68+
return ans
5969
```
6070

6171
### **Java**
6272

6373
```java
74+
class Solution {
75+
public int uniqueLetterString(String s) {
76+
List<Integer>[] d = new List[26];
77+
for (int i = 0; i < 26; ++i) {
78+
d[i] = new ArrayList<>();
79+
d[i].add(-1);
80+
}
81+
for (int i = 0; i < s.length(); ++i) {
82+
d[s.charAt(i) - 'A'].add(i);
83+
}
84+
int ans = 0;
85+
for (var v : d) {
86+
v.add(s.length());
87+
for (int i = 1; i < v.size() - 1; ++i) {
88+
ans += (v.get(i) - v.get(i - 1)) * (v.get(i + 1) - v.get(i));
89+
}
90+
}
91+
return ans;
92+
}
93+
}
94+
```
95+
96+
### **C++**
97+
98+
```cpp
99+
class Solution {
100+
public:
101+
int uniqueLetterString(string s) {
102+
vector<vector<int>> d(26, {-1});
103+
for (int i = 0; i < s.size(); ++i) {
104+
d[s[i] - 'A'].push_back(i);
105+
}
106+
int ans = 0;
107+
for (auto& v : d) {
108+
v.push_back(s.size());
109+
for (int i = 1; i < v.size() - 1; ++i) {
110+
ans += (v[i] - v[i - 1]) * (v[i + 1] - v[i]);
111+
}
112+
}
113+
return ans;
114+
}
115+
};
116+
```
64117
118+
### **Go**
119+
120+
```go
121+
func uniqueLetterString(s string) int {
122+
d := make([][]int, 26)
123+
for i := range d {
124+
d[i] = []int{-1}
125+
}
126+
for i, c := range s {
127+
d[c-'A'] = append(d[c-'A'], i)
128+
}
129+
ans := 0
130+
for _, v := range d {
131+
v = append(v, len(s))
132+
for i := 1; i < len(v)-1; i++ {
133+
ans += (v[i] - v[i-1]) * (v[i+1] - v[i])
134+
}
135+
}
136+
return ans
137+
}
65138
```
66139

67140
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
int uniqueLetterString(string s) {
4+
vector<vector<int>> d(26, {-1});
5+
for (int i = 0; i < s.size(); ++i) {
6+
d[s[i] - 'A'].push_back(i);
7+
}
8+
int ans = 0;
9+
for (auto& v : d) {
10+
v.push_back(s.size());
11+
for (int i = 1; i < v.size() - 1; ++i) {
12+
ans += (v[i] - v[i - 1]) * (v[i + 1] - v[i]);
13+
}
14+
}
15+
return ans;
16+
}
17+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
func uniqueLetterString(s string) int {
2+
d := make([][]int, 26)
3+
for i := range d {
4+
d[i] = []int{-1}
5+
}
6+
for i, c := range s {
7+
d[c-'A'] = append(d[c-'A'], i)
8+
}
9+
ans := 0
10+
for _, v := range d {
11+
v = append(v, len(s))
12+
for i := 1; i < len(v)-1; i++ {
13+
ans += (v[i] - v[i-1]) * (v[i+1] - v[i])
14+
}
15+
}
16+
return ans
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public int uniqueLetterString(String s) {
3+
List<Integer>[] d = new List[26];
4+
for (int i = 0; i < 26; ++i) {
5+
d[i] = new ArrayList<>();
6+
d[i].add(-1);
7+
}
8+
for (int i = 0; i < s.length(); ++i) {
9+
d[s.charAt(i) - 'A'].add(i);
10+
}
11+
int ans = 0;
12+
for (var v : d) {
13+
v.add(s.length());
14+
for (int i = 1; i < v.size() - 1; ++i) {
15+
ans += (v.get(i) - v.get(i - 1)) * (v.get(i + 1) - v.get(i));
16+
}
17+
}
18+
return ans;
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution:
2+
def uniqueLetterString(self, s: str) -> int:
3+
d = defaultdict(list)
4+
for i, c in enumerate(s):
5+
d[c].append(i)
6+
ans = 0
7+
for v in d.values():
8+
v = [-1] + v + [len(s)]
9+
for i in range(1, len(v) - 1):
10+
ans += (v[i] - v[i - 1]) * (v[i + 1] - v[i])
11+
return ans

solution/2100-2199/2104.Sum of Subarray Ranges/README.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -70,21 +70,21 @@
7070

7171
**方法一:暴力枚举**
7272

73-
循环遍历 i,作为子数组的起始位置。对于每个 i,遍历每个 j 作为子数组的终止位置,此过程中不断求解子数组的最大值、最小值,然后累加差值到结果 ans 中。
73+
循环遍历 $i$,作为子数组的起始位置。对于每个 $i$,遍历每个 $j$ 作为子数组的终止位置,此过程中不断求解子数组的最大值、最小值,然后累加差值到结果 `ans` 中。
7474

75-
最后返回 ans 即可。
75+
最后返回 `ans` 即可。
7676

77-
时间复杂度 O(n²)
77+
时间复杂度 $O(n^2)$
7878

7979
**方法二:单调栈**
8080

8181
枚举每个元素 `nums[i]` 作为最大值出现在了多少个子数组中,以及作为最小值出现在多少个子数组中。
8282

8383
其中 `nums[i]` 作为最大值的贡献为正,作为最小值的贡献为负。
8484

85-
我们以 `nums[i]` 作为最大值为例。找出左侧第一个比 `nums[i]` 大的位置 `left[i]`,右侧第一个大于等于 `nums[i]` 的位置 `right[i]`。计算每个 `nums[i]` 的贡献 `(i - left[i]) * (right[i] - i) * arr[i]`,累加得到结果。
85+
我们以 `nums[i]` 作为最大值为例。找出左侧第一个比 `nums[i]` 大的位置 `left[i]`,右侧第一个大于等于 `nums[i]` 的位置 `right[i]`。计算每个 `nums[i]` 的贡献 $(i - left[i])\times (right[i] - i)\times arr[i]$,累加得到结果。
8686

87-
时间复杂度 O(n)。
87+
时间复杂度 $O(n)$
8888

8989
相似题目:[907. 子数组的最小值之和](/solution/0900-0999/0907.Sum%20of%20Subarray%20Minimums/README.md)
9090

0 commit comments

Comments
 (0)