Skip to content

Commit c4e0218

Browse files
committed
feat: add solutions to lc problem: No.0467
No.0467.Unique Substrings in Wraparound String
1 parent b62b605 commit c4e0218

File tree

6 files changed

+248
-6
lines changed

6 files changed

+248
-6
lines changed

solution/0400-0499/0467.Unique Substrings in Wraparound String/README.md

+90-4
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,13 @@
5353

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

56-
题目导读,为什么示例 2 只有两个字串?
56+
**方法一:动态规划**
5757

58-
> 成为字串的一个标准,需要是连续的,`a``c` 之间少了一个 `b`,所以不能算一个子字符串
58+
不妨设 `dp[α]` 表示 p 中以字符 α 结尾且在 s 中的子串的最大长度,将 dp 求和可以得到最终结果。
59+
60+
时间复杂度 O(n),其中 n 表示字符串 p 的长度。
61+
62+
> 成为子串的一个标准,需要是连续的,`a``c` 之间少了一个 `b`,所以不能算一个子字符串。
5963
6064
<!-- tabs:start -->
6165

@@ -64,15 +68,45 @@
6468
<!-- 这里可写当前语言的特殊实现逻辑 -->
6569

6670
```python
67-
71+
class Solution:
72+
def findSubstringInWraproundString(self, p: str) -> int:
73+
dp = [0] * 26
74+
k = 0
75+
for i, c in enumerate(p):
76+
if i and (ord(c) - ord(p[i - 1])) % 26 == 1:
77+
k += 1
78+
else:
79+
k = 1
80+
idx = ord(c) - ord('a')
81+
dp[idx] = max(dp[idx], k)
82+
return sum(dp)
6883
```
6984

7085
### **Java**
7186

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

7489
```java
75-
90+
class Solution {
91+
public int findSubstringInWraproundString(String p) {
92+
int[] dp = new int[26];
93+
int k = 0;
94+
for (int i = 0; i < p.length(); ++i) {
95+
char c = p.charAt(i);
96+
if (i > 0 && (c - p.charAt(i - 1) + 26) % 26 == 1) {
97+
++k;
98+
} else {
99+
k = 1;
100+
}
101+
dp[c - 'a'] = Math.max(dp[c - 'a'], k);
102+
}
103+
int ans = 0;
104+
for (int v : dp) {
105+
ans += v;
106+
}
107+
return ans;
108+
}
109+
}
76110
```
77111

78112
### **TypeScript**
@@ -120,6 +154,58 @@ impl Solution {
120154
}
121155
```
122156

157+
### **C++**
158+
159+
```cpp
160+
class Solution {
161+
public:
162+
int findSubstringInWraproundString(string p) {
163+
vector<int> dp(26);
164+
int k = 0;
165+
for (int i = 0; i < p.size(); ++i)
166+
{
167+
char c = p[i];
168+
if (i && (c - p[i - 1] + 26) % 26 == 1) ++k;
169+
else k = 1;
170+
dp[c - 'a'] = max(dp[c - 'a'], k);
171+
}
172+
int ans = 0;
173+
for (int& v : dp) ans += v;
174+
return ans;
175+
}
176+
};
177+
```
178+
179+
### **Go**
180+
181+
```go
182+
func findSubstringInWraproundString(p string) int {
183+
dp := make([]int, 26)
184+
k := 0
185+
for i := range p {
186+
c := p[i]
187+
if i > 0 && (c-p[i-1]+26)%26 == 1 {
188+
k++
189+
} else {
190+
k = 1
191+
}
192+
dp[c-'a'] = max(dp[c-'a'], k)
193+
}
194+
ans := 0
195+
for _, v := range dp {
196+
ans += v
197+
}
198+
return ans
199+
}
200+
201+
func max(a, b int) int {
202+
if a > b {
203+
return a
204+
}
205+
return b
206+
}
207+
```
208+
123209
### **...**
124210

125211
```

solution/0400-0499/0467.Unique Substrings in Wraparound String/README_EN.md

+84-2
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,43 @@ Explanation: Only the substring &quot;a&quot; of p is in s.
5252
### **Python3**
5353

5454
```python
55-
55+
class Solution:
56+
def findSubstringInWraproundString(self, p: str) -> int:
57+
dp = [0] * 26
58+
k = 0
59+
for i, c in enumerate(p):
60+
if i and (ord(c) - ord(p[i - 1])) % 26 == 1:
61+
k += 1
62+
else:
63+
k = 1
64+
idx = ord(c) - ord('a')
65+
dp[idx] = max(dp[idx], k)
66+
return sum(dp)
5667
```
5768

5869
### **Java**
5970

6071
```java
61-
72+
class Solution {
73+
public int findSubstringInWraproundString(String p) {
74+
int[] dp = new int[26];
75+
int k = 0;
76+
for (int i = 0; i < p.length(); ++i) {
77+
char c = p.charAt(i);
78+
if (i > 0 && (c - p.charAt(i - 1) + 26) % 26 == 1) {
79+
++k;
80+
} else {
81+
k = 1;
82+
}
83+
dp[c - 'a'] = Math.max(dp[c - 'a'], k);
84+
}
85+
int ans = 0;
86+
for (int v : dp) {
87+
ans += v;
88+
}
89+
return ans;
90+
}
91+
}
6292
```
6393

6494
### **TypeScript**
@@ -106,6 +136,58 @@ impl Solution {
106136
}
107137
```
108138

139+
### **C++**
140+
141+
```cpp
142+
class Solution {
143+
public:
144+
int findSubstringInWraproundString(string p) {
145+
vector<int> dp(26);
146+
int k = 0;
147+
for (int i = 0; i < p.size(); ++i)
148+
{
149+
char c = p[i];
150+
if (i && (c - p[i - 1] + 26) % 26 == 1) ++k;
151+
else k = 1;
152+
dp[c - 'a'] = max(dp[c - 'a'], k);
153+
}
154+
int ans = 0;
155+
for (int& v : dp) ans += v;
156+
return ans;
157+
}
158+
};
159+
```
160+
161+
### **Go**
162+
163+
```go
164+
func findSubstringInWraproundString(p string) int {
165+
dp := make([]int, 26)
166+
k := 0
167+
for i := range p {
168+
c := p[i]
169+
if i > 0 && (c-p[i-1]+26)%26 == 1 {
170+
k++
171+
} else {
172+
k = 1
173+
}
174+
dp[c-'a'] = max(dp[c-'a'], k)
175+
}
176+
ans := 0
177+
for _, v := range dp {
178+
ans += v
179+
}
180+
return ans
181+
}
182+
183+
func max(a, b int) int {
184+
if a > b {
185+
return a
186+
}
187+
return b
188+
}
189+
```
190+
109191
### **...**
110192

111193
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
int findSubstringInWraproundString(string p) {
4+
vector<int> dp(26);
5+
int k = 0;
6+
for (int i = 0; i < p.size(); ++i)
7+
{
8+
char c = p[i];
9+
if (i && (c - p[i - 1] + 26) % 26 == 1) ++k;
10+
else k = 1;
11+
dp[c - 'a'] = max(dp[c - 'a'], k);
12+
}
13+
int ans = 0;
14+
for (int& v : dp) ans += v;
15+
return ans;
16+
}
17+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
func findSubstringInWraproundString(p string) int {
2+
dp := make([]int, 26)
3+
k := 0
4+
for i := range p {
5+
c := p[i]
6+
if i > 0 && (c-p[i-1]+26)%26 == 1 {
7+
k++
8+
} else {
9+
k = 1
10+
}
11+
dp[c-'a'] = max(dp[c-'a'], k)
12+
}
13+
ans := 0
14+
for _, v := range dp {
15+
ans += v
16+
}
17+
return ans
18+
}
19+
20+
func max(a, b int) int {
21+
if a > b {
22+
return a
23+
}
24+
return b
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public int findSubstringInWraproundString(String p) {
3+
int[] dp = new int[26];
4+
int k = 0;
5+
for (int i = 0; i < p.length(); ++i) {
6+
char c = p.charAt(i);
7+
if (i > 0 && (c - p.charAt(i - 1) + 26) % 26 == 1) {
8+
++k;
9+
} else {
10+
k = 1;
11+
}
12+
dp[c - 'a'] = Math.max(dp[c - 'a'], k);
13+
}
14+
int ans = 0;
15+
for (int v : dp) {
16+
ans += v;
17+
}
18+
return ans;
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def findSubstringInWraproundString(self, p: str) -> int:
3+
dp = [0] * 26
4+
k = 0
5+
for i, c in enumerate(p):
6+
if i and (ord(c) - ord(p[i - 1])) % 26 == 1:
7+
k += 1
8+
else:
9+
k = 1
10+
idx = ord(c) - ord('a')
11+
dp[idx] = max(dp[idx], k)
12+
return sum(dp)

0 commit comments

Comments
 (0)