-
Notifications
You must be signed in to change notification settings - Fork 0
/
Backspace_String_Compare.swift
111 lines (93 loc) · 2.75 KB
/
Backspace_String_Compare.swift
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
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?
*/
/*
Solution: Directly update S & T
Use Array to help checking, when char is not # append it into arr, if it is #, removeLast
Time Complexity: O(M + N), where M, NM,N are the lengths of S and T respectively.
Space Complexity: O(M + N).
*/
class Solution {
func backspaceCompare(_ S: String, _ T: String) -> Bool {
return result(of: S) == result(of: T)
}
func result(of str: String) -> String {
var arr = [Character]()
for s in str {
if s == "#" {
guard !arr.isEmpty else { continue }
arr.removeLast()
} else {
arr.append(s)
}
}
return String(arr)
}
}
/*
Solution 2:
Iterate through the string in reverse. If we see a backspace character, the next non-backspace character is skipped. If a character isn't skipped, it is part of the final answer.
Time Complexity: O(M + N), where M, NM,N are the lengths of S and T respectively.
Space Complexity: O(1).
*/
class Solution {
func backspaceCompare(_ S: String, _ T: String) -> Bool {
var S = Array(S)
var T = Array(T)
var indexS = 0
var indexT = 0
var backS = S.count - 1
var backT = T.count - 1
while backS >= 0 || backT >= 0 {
while backS >= 0 {
if S[backS] == "#" {
indexS += 1
backS -= 1
} else if indexS > 0 {
indexS -= 1
backS -= 1
} else {
break
}
}
while backT >= 0 {
if T[backT] == "#" {
indexT += 1
backT -= 1
} else if indexT > 0 {
indexT -= 1
backT -= 1
} else {
break
}
}
if backS >= 0, backT >= 0, S[backS] != T[backT] { return false }
if (backS >= 0) != (backT >= 0) { return false }
backS -= 1
backT -= 1
}
return true
}
}