Решение задачи 844 “Backspace String Compare” с LeetCode.
Условие задачи
Даны две строки S
и T
, необходимо вернуть результат сравнения этих строк, если воспринимать их как последовательность напечатанных символов, где #
- означает backspace.
пример 1
1
2
3
|
Input: S = "ab#c", T = "ad#c"
Output: true
Explanation: Both S and T become "ac".
|
пример 2
1
2
3
|
Input: S = "ab##", T = "c#d#"
Output: true
Explanation: Both S and T become "".
|
пример 3
1
2
3
|
Input: S = "a##c", T = "#a#c"
Output: true
Explanation: Both S and T become "c".
|
пример 4
1
2
3
|
Input: S = "a#c", T = "b"
Output: false
Explanation: S becomes "c" while T becomes "b".
|
ограничения
1 <= S.length <= 200
1 <= T.length <= 200
S
и T
содержать только буквы в нижнем регистре и #
Решение
Brute force
Идея алгоримма
Написать метод, который будет идти по заданной строке и при встрече #
удалять его и предыдущий символ( если есть).
Отправить обе входных строки в этот метод и сравнить результат
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
func backspaceCompare(S string, T string) bool {
S = clear(S)
T = clear(T)
return S == T
}
func clear(S string) string {
for idx := 0; idx < len(S); idx++ {
if string(S[idx]) != "#" {
continue
}
if idx-1 >= 0 {
S = S[:idx-1] + S[idx:]
fmt.Println("->", idx, S)
idx--
}
S = S[:idx] + S[idx+1:]
idx--
}
return S
}
|
Два указателя
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
func backspaceCompare(S string, T string) bool {
s := len(S)-1
t := len(T)-1
sb := 0
tb := 0
for t>=0 || s>=0 {
for s >= 0 {
if string(S[s]) == "#" {
sb++
s--
} else if sb>0 {
sb--
s--
}else {
break
}
}
for t >= 0 {
if string(T[t]) == "#" {
tb++
t--
} else if tb>0 {
tb--
t--
}else {
break
}
}
if s>=0 && t>= 0&& S[s]!=T[t]{
return false
}
if (s>=0) != (t>=0) {
return false
}
s--
t--
}
return true
}
|