-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathbackspaceCompare.go
More file actions
91 lines (79 loc) · 1.77 KB
/
Copy pathbackspaceCompare.go
File metadata and controls
91 lines (79 loc) · 1.77 KB
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/* https://leetcode.com/problems/backspace-string-compare/description/
Given two strings S and T, return if they are equal when both are typed into empty text editors. # means a backspace character.
Example 1:
Input: S = "ab#c", T = "ad#c"
Output: true
Explanation: Both S and T become "ac".
Example 2:
Input: S = "ab##", T = "c#d#"
Output: true
Explanation: Both S and T become "".
Example 3:
Input: S = "a##c", T = "#a#c"
Output: true
Explanation: Both S and T become "c".
Example 4:
Input: S = "a#c", T = "b"
Output: false
Explanation: S becomes "c" while T becomes "b".
Note:
1 <= S.length <= 200
1 <= T.length <= 200
S and T only contain lowercase letters and '#' characters.
Follow up:
Can you solve it in O(N) time and O(1) space?
*/
package lstack
/*
// Use stack.
func backspaceCompare(S string, T string) bool {
helper := func(S string) (res []rune) {
for _, letter := range S {
if letter != '#' {
res = append(res, letter)
} else if len(res) > 0 {
res = res[:len(res)-1]
}
}
return res
}
stackS, stackT := helper(S), helper(T)
if len(stackS) != len(stackT) {
return false
}
for i := range stackS {
if stackS[i] != stackT[i] {
return false
}
}
return true
}
*/
// O(N) time and O(1) space. Two Pointers.
func backspaceCompare(S string, T string) bool {
nextLast := func(S string, idx int) (nextIdx int) {
if idx == len(S)-1 && S[idx] != '#' {
return idx
}
for count := 0; idx >= 0; idx-- {
if S[idx] == '#' {
count++
} else if count > 0 {
count--
} else {
return idx
}
}
return -1
}
idxS, idxT := nextLast(S, len(S)-1), nextLast(T, len(T)-1)
for idxS >= 0 && idxT >= 0 {
if S[idxS] != T[idxT] {
return false
}
idxS--
idxT--
idxS, idxT = nextLast(S, idxS), nextLast(T, idxT)
}
return idxS == idxT
}