Skip to content

Commit c520c5a

Browse files
authored
feat: add solutions to lc problem: No.3406 (#4461)
No.3406.Find the Lexicographically Largest String From the Box II
1 parent 297e28c commit c520c5a

File tree

7 files changed

+413
-6
lines changed

7 files changed

+413
-6
lines changed

solution/3400-3499/3406.Find the Lexicographically Largest String From the Box II/README.md

Lines changed: 139 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,25 +88,161 @@ tags:
8888
#### Python3
8989

9090
```python
91-
91+
class Solution:
92+
def answerString(self, word: str, numFriends: int) -> str:
93+
if numFriends == 1:
94+
return word
95+
s = self.lastSubstring(word)
96+
return s[: len(word) - numFriends + 1]
97+
98+
def lastSubstring(self, s: str) -> str:
99+
i, j, k = 0, 1, 0
100+
while j + k < len(s):
101+
if s[i + k] == s[j + k]:
102+
k += 1
103+
elif s[i + k] < s[j + k]:
104+
i += k + 1
105+
k = 0
106+
if i >= j:
107+
j = i + 1
108+
else:
109+
j += k + 1
110+
k = 0
111+
return s[i:]
92112
```
93113

94114
#### Java
95115

96116
```java
97-
117+
class Solution {
118+
public String answerString(String word, int numFriends) {
119+
if (numFriends == 1) {
120+
return word;
121+
}
122+
String s = lastSubstring(word);
123+
return s.substring(0, Math.min(s.length(), word.length() - numFriends + 1));
124+
}
125+
126+
public String lastSubstring(String s) {
127+
int n = s.length();
128+
int i = 0, j = 1, k = 0;
129+
while (j + k < n) {
130+
int d = s.charAt(i + k) - s.charAt(j + k);
131+
if (d == 0) {
132+
++k;
133+
} else if (d < 0) {
134+
i += k + 1;
135+
k = 0;
136+
if (i >= j) {
137+
j = i + 1;
138+
}
139+
} else {
140+
j += k + 1;
141+
k = 0;
142+
}
143+
}
144+
return s.substring(i);
145+
}
146+
}
98147
```
99148

100149
#### C++
101150

102151
```cpp
103-
152+
class Solution {
153+
public:
154+
string answerString(string word, int numFriends) {
155+
if (numFriends == 1) {
156+
return word;
157+
}
158+
string s = lastSubstring(word);
159+
return s.substr(0, min(s.length(), word.length() - numFriends + 1));
160+
}
161+
162+
string lastSubstring(string& s) {
163+
int n = s.size();
164+
int i = 0, j = 1, k = 0;
165+
while (j + k < n) {
166+
if (s[i + k] == s[j + k]) {
167+
++k;
168+
} else if (s[i + k] < s[j + k]) {
169+
i += k + 1;
170+
k = 0;
171+
if (i >= j) {
172+
j = i + 1;
173+
}
174+
} else {
175+
j += k + 1;
176+
k = 0;
177+
}
178+
}
179+
return s.substr(i);
180+
}
181+
};
104182
```
105183

106184
#### Go
107185

108186
```go
187+
func answerString(word string, numFriends int) string {
188+
if numFriends == 1 {
189+
return word
190+
}
191+
s := lastSubstring(word)
192+
return s[:min(len(s), len(word)-numFriends+1)]
193+
}
194+
195+
func lastSubstring(s string) string {
196+
n := len(s)
197+
i, j, k := 0, 1, 0
198+
for j+k < n {
199+
if s[i+k] == s[j+k] {
200+
k++
201+
} else if s[i+k] < s[j+k] {
202+
i += k + 1
203+
k = 0
204+
if i >= j {
205+
j = i + 1
206+
}
207+
} else {
208+
j += k + 1
209+
k = 0
210+
}
211+
}
212+
return s[i:]
213+
}
214+
```
109215

216+
#### TypeScript
217+
218+
```ts
219+
function answerString(word: string, numFriends: number): string {
220+
if (numFriends === 1) {
221+
return word;
222+
}
223+
const s = lastSubstring(word);
224+
return s.slice(0, word.length - numFriends + 1);
225+
}
226+
227+
function lastSubstring(s: string): string {
228+
const n = s.length;
229+
let i = 0;
230+
for (let j = 1, k = 0; j + k < n; ) {
231+
if (s[i + k] === s[j + k]) {
232+
++k;
233+
} else if (s[i + k] < s[j + k]) {
234+
i += k + 1;
235+
k = 0;
236+
if (i >= j) {
237+
j = i + 1;
238+
}
239+
} else {
240+
j += k + 1;
241+
k = 0;
242+
}
243+
}
244+
return s.slice(i);
245+
}
110246
```
111247

112248
<!-- tabs:end -->

solution/3400-3499/3406.Find the Lexicographically Largest String From the Box II/README_EN.md

Lines changed: 139 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,25 +84,161 @@ If the first <code>min(a.length, b.length)</code> characters do not differ, then
8484
#### Python3
8585

8686
```python
87-
87+
class Solution:
88+
def answerString(self, word: str, numFriends: int) -> str:
89+
if numFriends == 1:
90+
return word
91+
s = self.lastSubstring(word)
92+
return s[: len(word) - numFriends + 1]
93+
94+
def lastSubstring(self, s: str) -> str:
95+
i, j, k = 0, 1, 0
96+
while j + k < len(s):
97+
if s[i + k] == s[j + k]:
98+
k += 1
99+
elif s[i + k] < s[j + k]:
100+
i += k + 1
101+
k = 0
102+
if i >= j:
103+
j = i + 1
104+
else:
105+
j += k + 1
106+
k = 0
107+
return s[i:]
88108
```
89109

90110
#### Java
91111

92112
```java
93-
113+
class Solution {
114+
public String answerString(String word, int numFriends) {
115+
if (numFriends == 1) {
116+
return word;
117+
}
118+
String s = lastSubstring(word);
119+
return s.substring(0, Math.min(s.length(), word.length() - numFriends + 1));
120+
}
121+
122+
public String lastSubstring(String s) {
123+
int n = s.length();
124+
int i = 0, j = 1, k = 0;
125+
while (j + k < n) {
126+
int d = s.charAt(i + k) - s.charAt(j + k);
127+
if (d == 0) {
128+
++k;
129+
} else if (d < 0) {
130+
i += k + 1;
131+
k = 0;
132+
if (i >= j) {
133+
j = i + 1;
134+
}
135+
} else {
136+
j += k + 1;
137+
k = 0;
138+
}
139+
}
140+
return s.substring(i);
141+
}
142+
}
94143
```
95144

96145
#### C++
97146

98147
```cpp
99-
148+
class Solution {
149+
public:
150+
string answerString(string word, int numFriends) {
151+
if (numFriends == 1) {
152+
return word;
153+
}
154+
string s = lastSubstring(word);
155+
return s.substr(0, min(s.length(), word.length() - numFriends + 1));
156+
}
157+
158+
string lastSubstring(string& s) {
159+
int n = s.size();
160+
int i = 0, j = 1, k = 0;
161+
while (j + k < n) {
162+
if (s[i + k] == s[j + k]) {
163+
++k;
164+
} else if (s[i + k] < s[j + k]) {
165+
i += k + 1;
166+
k = 0;
167+
if (i >= j) {
168+
j = i + 1;
169+
}
170+
} else {
171+
j += k + 1;
172+
k = 0;
173+
}
174+
}
175+
return s.substr(i);
176+
}
177+
};
100178
```
101179

102180
#### Go
103181

104182
```go
183+
func answerString(word string, numFriends int) string {
184+
if numFriends == 1 {
185+
return word
186+
}
187+
s := lastSubstring(word)
188+
return s[:min(len(s), len(word)-numFriends+1)]
189+
}
190+
191+
func lastSubstring(s string) string {
192+
n := len(s)
193+
i, j, k := 0, 1, 0
194+
for j+k < n {
195+
if s[i+k] == s[j+k] {
196+
k++
197+
} else if s[i+k] < s[j+k] {
198+
i += k + 1
199+
k = 0
200+
if i >= j {
201+
j = i + 1
202+
}
203+
} else {
204+
j += k + 1
205+
k = 0
206+
}
207+
}
208+
return s[i:]
209+
}
210+
```
105211

212+
#### TypeScript
213+
214+
```ts
215+
function answerString(word: string, numFriends: number): string {
216+
if (numFriends === 1) {
217+
return word;
218+
}
219+
const s = lastSubstring(word);
220+
return s.slice(0, word.length - numFriends + 1);
221+
}
222+
223+
function lastSubstring(s: string): string {
224+
const n = s.length;
225+
let i = 0;
226+
for (let j = 1, k = 0; j + k < n; ) {
227+
if (s[i + k] === s[j + k]) {
228+
++k;
229+
} else if (s[i + k] < s[j + k]) {
230+
i += k + 1;
231+
k = 0;
232+
if (i >= j) {
233+
j = i + 1;
234+
}
235+
} else {
236+
j += k + 1;
237+
k = 0;
238+
}
239+
}
240+
return s.slice(i);
241+
}
106242
```
107243

108244
<!-- tabs:end -->
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class Solution {
2+
public:
3+
string answerString(string word, int numFriends) {
4+
if (numFriends == 1) {
5+
return word;
6+
}
7+
string s = lastSubstring(word);
8+
return s.substr(0, min(s.length(), word.length() - numFriends + 1));
9+
}
10+
11+
string lastSubstring(string& s) {
12+
int n = s.size();
13+
int i = 0, j = 1, k = 0;
14+
while (j + k < n) {
15+
if (s[i + k] == s[j + k]) {
16+
++k;
17+
} else if (s[i + k] < s[j + k]) {
18+
i += k + 1;
19+
k = 0;
20+
if (i >= j) {
21+
j = i + 1;
22+
}
23+
} else {
24+
j += k + 1;
25+
k = 0;
26+
}
27+
}
28+
return s.substr(i);
29+
}
30+
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
func answerString(word string, numFriends int) string {
2+
if numFriends == 1 {
3+
return word
4+
}
5+
s := lastSubstring(word)
6+
return s[:min(len(s), len(word)-numFriends+1)]
7+
}
8+
9+
func lastSubstring(s string) string {
10+
n := len(s)
11+
i, j, k := 0, 1, 0
12+
for j+k < n {
13+
if s[i+k] == s[j+k] {
14+
k++
15+
} else if s[i+k] < s[j+k] {
16+
i += k + 1
17+
k = 0
18+
if i >= j {
19+
j = i + 1
20+
}
21+
} else {
22+
j += k + 1
23+
k = 0
24+
}
25+
}
26+
return s[i:]
27+
}

0 commit comments

Comments
 (0)