Skip to content

Commit eb6d7d4

Browse files
committed
feat: add solutions to lc problem: No.2573
No.2573.Find the String with LCP
1 parent 61b49ed commit eb6d7d4

File tree

6 files changed

+443
-8
lines changed

6 files changed

+443
-8
lines changed

solution/2500-2599/2573.Find the String with LCP/README.md

Lines changed: 159 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,34 +55,189 @@
5555

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

58+
**方法一:贪心 + 构造**
59+
60+
由于构造的字符串要求字典序最小,因此我们可以从字符 `'a'` 开始,填充到字符串 $s$ 中。
61+
62+
如果当前位置 $i$ 还未填充字符,那么我们可以将字符 `'a'` 填充到 $i$ 位置,然后枚举所有 $j \gt i$ 的位置,如果 $lcp[i][j] \gt 0$,那么位置 $j$ 也应该填充字符 `'a'`。然后我们将字符 `'a'` 的 ASCII 码加一,继续填充剩余未填充的位置。
63+
64+
填充结束后,如果字符串中存在未填充的位置,说明无法构造出对应的字符串,返回空字符串。
65+
66+
接下来,我们可以从大到小枚举字符串中的每个位置 $i$ 和 $j$,然后判断 $s[i]$ 和 $s[j]$ 是否相等:
67+
68+
- 如果 $s[i] = s[j]$,此时我们需要判断 $i$ 和 $j$ 是否为字符串的最后一个位置,如果是,那么 $lcp[i][j]$ 应该等于 $1$,否则 $lcp[i][j]$ 应该等于 $0$。如果不满足上述条件,说明无法构造出对应的字符串,返回空字符串。如果 $i$ 和 $j$ 不是字符串的最后一个位置,那么 $lcp[i][j]$ 应该等于 $lcp[i + 1][j + 1] + 1$,否则说明无法构造出对应的字符串,返回空字符串。
69+
- 否则,如果 $lcp[i][j] \gt 0$,说明无法构造出对应的字符串,返回空字符串。
70+
71+
如果字符串中的每个位置都满足上述条件,那么我们就可以构造出对应的字符串,返回即可。
72+
73+
时间复杂度为 $O(n^2)$,空间复杂度为 $O(n)$。其中 $n$ 为字符串的长度。
74+
5875
<!-- tabs:start -->
5976

6077
### **Python3**
6178

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

6481
```python
65-
82+
class Solution:
83+
def findTheString(self, lcp: List[List[int]]) -> str:
84+
n = len(lcp)
85+
s = [""] * n
86+
i = 0
87+
for c in ascii_lowercase:
88+
while i < n and s[i]:
89+
i += 1
90+
if i == n:
91+
break
92+
for j in range(i, n):
93+
if lcp[i][j]:
94+
s[j] = c
95+
if "" in s:
96+
return ""
97+
for i in range(n - 1, -1, -1):
98+
for j in range(n - 1, -1, -1):
99+
if s[i] == s[j]:
100+
if i == n - 1 or j == n - 1:
101+
if lcp[i][j] != 1:
102+
return ""
103+
elif lcp[i][j] != lcp[i + 1][j + 1] + 1:
104+
return ""
105+
elif lcp[i][j]:
106+
return ""
107+
return "".join(s)
66108
```
67109

68110
### **Java**
69111

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

72114
```java
73-
115+
class Solution {
116+
public String findTheString(int[][] lcp) {
117+
int n = lcp.length;
118+
char[] s = new char[n];
119+
int i = 0;
120+
for (char c = 'a'; c <= 'z'; ++c) {
121+
while (i < n && s[i] != '\0') {
122+
++i;
123+
}
124+
if (i == n) {
125+
break;
126+
}
127+
for (int j = i; j < n; ++j) {
128+
if (lcp[i][j] > 0) {
129+
s[j] = c;
130+
}
131+
}
132+
}
133+
for (i = 0; i < n; ++i) {
134+
if (s[i] == '\0') {
135+
return "";
136+
}
137+
}
138+
for (i = n - 1; i >= 0; --i) {
139+
for (int j = n - 1; j >= 0; --j) {
140+
if (s[i] == s[j]) {
141+
if (i == n - 1 || j == n - 1) {
142+
if (lcp[i][j] != 1) {
143+
return "";
144+
}
145+
} else if (lcp[i][j] != lcp[i + 1][j + 1] + 1) {
146+
return "";
147+
}
148+
} else if (lcp[i][j] > 0) {
149+
return "";
150+
}
151+
}
152+
}
153+
return String.valueOf(s);
154+
}
155+
}
74156
```
75157

76158
### **C++**
77159

78160
```cpp
79-
161+
class Solution {
162+
public:
163+
string findTheString(vector<vector<int>>& lcp) {
164+
int i = 0, n = lcp.size();
165+
string s(n, '\0');
166+
for (char c = 'a'; c <= 'z'; ++c) {
167+
while (i < n && s[i]) {
168+
++i;
169+
}
170+
if (i == n) {
171+
break;
172+
}
173+
for (int j = i; j < n; ++j) {
174+
if (lcp[i][j]) {
175+
s[j] = c;
176+
}
177+
}
178+
}
179+
if (s.find('\0') != -1) {
180+
return "";
181+
}
182+
for (i = n - 1; ~i; --i) {
183+
for (int j = n - 1; ~j; --j) {
184+
if (s[i] == s[j]) {
185+
if (i == n - 1 || j == n - 1) {
186+
if (lcp[i][j] != 1) {
187+
return "";
188+
}
189+
} else if (lcp[i][j] != lcp[i + 1][j + 1] + 1) {
190+
return "";
191+
}
192+
} else if (lcp[i][j]) {
193+
return "";
194+
}
195+
}
196+
}
197+
return s;
198+
}
199+
};
80200
```
81201
82202
### **Go**
83203
84204
```go
85-
205+
func findTheString(lcp [][]int) string {
206+
i, n := 0, len(lcp)
207+
s := make([]byte, n)
208+
for c := 'a'; c <= 'z'; c++ {
209+
for i < n && s[i] != 0 {
210+
i++
211+
}
212+
if i == n {
213+
break
214+
}
215+
for j := i; j < n; j++ {
216+
if lcp[i][j] > 0 {
217+
s[j] = byte(c)
218+
}
219+
}
220+
}
221+
if bytes.IndexByte(s, 0) >= 0 {
222+
return ""
223+
}
224+
for i := n - 1; i >= 0; i-- {
225+
for j := n - 1; j >= 0; j-- {
226+
if s[i] == s[j] {
227+
if i == n-1 || j == n-1 {
228+
if lcp[i][j] != 1 {
229+
return ""
230+
}
231+
} else if lcp[i][j] != lcp[i+1][j+1]+1 {
232+
return ""
233+
}
234+
} else if lcp[i][j] > 0 {
235+
return ""
236+
}
237+
}
238+
}
239+
return string(s)
240+
}
86241
```
87242

88243
### **...**

solution/2500-2599/2573.Find the String with LCP/README_EN.md

Lines changed: 142 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,25 +54,163 @@
5454
### **Python3**
5555

5656
```python
57-
57+
class Solution:
58+
def findTheString(self, lcp: List[List[int]]) -> str:
59+
n = len(lcp)
60+
s = [""] * n
61+
i = 0
62+
for c in ascii_lowercase:
63+
while i < n and s[i]:
64+
i += 1
65+
if i == n:
66+
break
67+
for j in range(i, n):
68+
if lcp[i][j]:
69+
s[j] = c
70+
if "" in s:
71+
return ""
72+
for i in range(n - 1, -1, -1):
73+
for j in range(n - 1, -1, -1):
74+
if s[i] == s[j]:
75+
if i == n - 1 or j == n - 1:
76+
if lcp[i][j] != 1:
77+
return ""
78+
elif lcp[i][j] != lcp[i + 1][j + 1] + 1:
79+
return ""
80+
elif lcp[i][j]:
81+
return ""
82+
return "".join(s)
5883
```
5984

6085
### **Java**
6186

6287
```java
63-
88+
class Solution {
89+
public String findTheString(int[][] lcp) {
90+
int n = lcp.length;
91+
char[] s = new char[n];
92+
int i = 0;
93+
for (char c = 'a'; c <= 'z'; ++c) {
94+
while (i < n && s[i] != '\0') {
95+
++i;
96+
}
97+
if (i == n) {
98+
break;
99+
}
100+
for (int j = i; j < n; ++j) {
101+
if (lcp[i][j] > 0) {
102+
s[j] = c;
103+
}
104+
}
105+
}
106+
for (i = 0; i < n; ++i) {
107+
if (s[i] == '\0') {
108+
return "";
109+
}
110+
}
111+
for (i = n - 1; i >= 0; --i) {
112+
for (int j = n - 1; j >= 0; --j) {
113+
if (s[i] == s[j]) {
114+
if (i == n - 1 || j == n - 1) {
115+
if (lcp[i][j] != 1) {
116+
return "";
117+
}
118+
} else if (lcp[i][j] != lcp[i + 1][j + 1] + 1) {
119+
return "";
120+
}
121+
} else if (lcp[i][j] > 0) {
122+
return "";
123+
}
124+
}
125+
}
126+
return String.valueOf(s);
127+
}
128+
}
64129
```
65130

66131
### **C++**
67132

68133
```cpp
69-
134+
class Solution {
135+
public:
136+
string findTheString(vector<vector<int>>& lcp) {
137+
int i = 0, n = lcp.size();
138+
string s(n, '\0');
139+
for (char c = 'a'; c <= 'z'; ++c) {
140+
while (i < n && s[i]) {
141+
++i;
142+
}
143+
if (i == n) {
144+
break;
145+
}
146+
for (int j = i; j < n; ++j) {
147+
if (lcp[i][j]) {
148+
s[j] = c;
149+
}
150+
}
151+
}
152+
if (s.find('\0') != -1) {
153+
return "";
154+
}
155+
for (i = n - 1; ~i; --i) {
156+
for (int j = n - 1; ~j; --j) {
157+
if (s[i] == s[j]) {
158+
if (i == n - 1 || j == n - 1) {
159+
if (lcp[i][j] != 1) {
160+
return "";
161+
}
162+
} else if (lcp[i][j] != lcp[i + 1][j + 1] + 1) {
163+
return "";
164+
}
165+
} else if (lcp[i][j]) {
166+
return "";
167+
}
168+
}
169+
}
170+
return s;
171+
}
172+
};
70173
```
71174
72175
### **Go**
73176
74177
```go
75-
178+
func findTheString(lcp [][]int) string {
179+
i, n := 0, len(lcp)
180+
s := make([]byte, n)
181+
for c := 'a'; c <= 'z'; c++ {
182+
for i < n && s[i] != 0 {
183+
i++
184+
}
185+
if i == n {
186+
break
187+
}
188+
for j := i; j < n; j++ {
189+
if lcp[i][j] > 0 {
190+
s[j] = byte(c)
191+
}
192+
}
193+
}
194+
if bytes.IndexByte(s, 0) >= 0 {
195+
return ""
196+
}
197+
for i := n - 1; i >= 0; i-- {
198+
for j := n - 1; j >= 0; j-- {
199+
if s[i] == s[j] {
200+
if i == n-1 || j == n-1 {
201+
if lcp[i][j] != 1 {
202+
return ""
203+
}
204+
} else if lcp[i][j] != lcp[i+1][j+1]+1 {
205+
return ""
206+
}
207+
} else if lcp[i][j] > 0 {
208+
return ""
209+
}
210+
}
211+
}
212+
return string(s)
213+
}
76214
```
77215

78216
### **...**

0 commit comments

Comments
 (0)