Skip to content

Commit 105153b

Browse files
authored
feat: add solutions to lc problem: No.3614 (#5246)
1 parent 8366a76 commit 105153b

30 files changed

Lines changed: 632 additions & 30 deletions

File tree

solution/3600-3699/3614.Process String with Special Operations II/README.md

Lines changed: 187 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -213,32 +213,215 @@ tags:
213213

214214
<!-- solution:start -->
215215

216-
### 方法一
216+
### 方法一:倒推
217+
218+
我们首先计算出处理过的结果字符串 $\textit{result}$ 的长度 $m$,如果 $k \geq m$,说明 $k$ 超出了结果字符串的下标,返回 '.'。
219+
220+
否则,我们倒序遍历字符串 $s$,分情况讨论:
221+
222+
1. 如果 $s[i]$ 是 '\*',我们将 $m$ 增加 $1$。
223+
1. 如果 $s[i]$ 是 '#',我们将 $m$ 除以 $2$,此时如果 $k \geq m$,我们应该将 $k$ 减去 $m$。
224+
1. 如果 $s[i]$ 是 '%',我们将 $k$ 置为 $m - 1 - k$。
225+
1. 否则,说明 $s[i]$ 是字母,我们将 $m$ 减去 $1$,如果 $k = m$,此时我们就找到了第 $k$ 个字符,返回 $s[i]$。
226+
227+
时间复杂度 $O(n)$,其中 $n$ 是字符串 $s$ 的长度。空间复杂度 $O(1)$。
217228

218229
<!-- tabs:start -->
219230

220231
#### Python3
221232

222233
```python
223-
234+
class Solution:
235+
def processStr(self, s: str, k: int) -> str:
236+
m = 0
237+
for c in s:
238+
if c == "*":
239+
m = max(0, m - 1)
240+
elif c == "#":
241+
m <<= 1
242+
elif c != "%":
243+
m += 1
244+
if k >= m:
245+
return "."
246+
for c in reversed(s):
247+
if c == "*":
248+
m += 1
249+
elif c == "#":
250+
m //= 2
251+
if k >= m:
252+
k -= m
253+
elif c == "%":
254+
k = m - 1 - k
255+
else:
256+
m -= 1
257+
if k == m:
258+
return c
224259
```
225260

226261
#### Java
227262

228263
```java
229-
264+
class Solution {
265+
public char processStr(String s, long k) {
266+
long m = 0;
267+
for (int i = 0; i < s.length(); i++) {
268+
char c = s.charAt(i);
269+
if (c == '*') {
270+
m = Math.max(0, m - 1);
271+
} else if (c == '#') {
272+
m <<= 1;
273+
} else if (c != '%') {
274+
m += 1;
275+
}
276+
}
277+
if (k >= m) {
278+
return '.';
279+
}
280+
for (int i = s.length() - 1;; i--) {
281+
char c = s.charAt(i);
282+
if (c == '*') {
283+
m += 1;
284+
} else if (c == '#') {
285+
m /= 2;
286+
if (k >= m) {
287+
k -= m;
288+
}
289+
} else if (c == '%') {
290+
k = m - 1 - k;
291+
} else {
292+
m -= 1;
293+
if (k == m) {
294+
return c;
295+
}
296+
}
297+
}
298+
}
299+
}
230300
```
231301

232302
#### C++
233303

234304
```cpp
235-
305+
class Solution {
306+
public:
307+
char processStr(string s, long long k) {
308+
long long m = 0;
309+
for (char c : s) {
310+
if (c == '*') {
311+
m = max(0LL, m - 1);
312+
} else if (c == '#') {
313+
m <<= 1;
314+
} else if (c != '%') {
315+
m += 1;
316+
}
317+
}
318+
if (k >= m) {
319+
return '.';
320+
}
321+
for (int i = s.length() - 1;; i--) {
322+
char c = s[i];
323+
if (c == '*') {
324+
m += 1;
325+
} else if (c == '#') {
326+
m /= 2;
327+
if (k >= m) {
328+
k -= m;
329+
}
330+
} else if (c == '%') {
331+
k = m - 1 - k;
332+
} else {
333+
m -= 1;
334+
if (k == m) {
335+
return c;
336+
}
337+
}
338+
}
339+
}
340+
};
236341
```
237342
238343
#### Go
239344
240345
```go
346+
func processStr(s string, k int64) byte {
347+
var m int64 = 0
348+
for i := 0; i < len(s); i++ {
349+
c := s[i]
350+
if c == '*' {
351+
if m-1 > 0 {
352+
m = m - 1
353+
} else {
354+
m = 0
355+
}
356+
} else if c == '#' {
357+
m <<= 1
358+
} else if c != '%' {
359+
m += 1
360+
}
361+
}
362+
if k >= m {
363+
return '.'
364+
}
365+
for i := len(s) - 1; ; i-- {
366+
c := s[i]
367+
if c == '*' {
368+
m += 1
369+
} else if c == '#' {
370+
m /= 2
371+
if k >= m {
372+
k -= m
373+
}
374+
} else if c == '%' {
375+
k = m - 1 - k
376+
} else {
377+
m -= 1
378+
if k == m {
379+
return c
380+
}
381+
}
382+
}
383+
}
384+
```
241385

386+
#### TypeScript
387+
388+
```ts
389+
function processStr(s: string, k: number): string {
390+
let m = 0n;
391+
for (let i = 0; i < s.length; i++) {
392+
const c = s[i];
393+
if (c === '*') {
394+
const sub = m - 1n;
395+
m = sub > 0n ? sub : 0n;
396+
} else if (c === '#') {
397+
m <<= 1n;
398+
} else if (c !== '%') {
399+
m += 1n;
400+
}
401+
}
402+
if (BigInt(k) >= m) {
403+
return '.';
404+
}
405+
let bigK = BigInt(k);
406+
for (let i = s.length - 1; ; i--) {
407+
const c = s[i];
408+
if (c === '*') {
409+
m += 1n;
410+
} else if (c === '#') {
411+
m /= 2n;
412+
if (bigK >= m) {
413+
bigK -= m;
414+
}
415+
} else if (c === '%') {
416+
bigK = m - 1n - bigK;
417+
} else {
418+
m -= 1n;
419+
if (bigK === m) {
420+
return c;
421+
}
422+
}
423+
}
424+
}
242425
```
243426

244427
<!-- tabs:end -->

0 commit comments

Comments
 (0)