Skip to content

Commit ac08058

Browse files
authored
Merge pull request soapyigu#193 from soapyigu/DFS
[DFS] Add solution to Remove Invalid Parentheses
2 parents 98f8701 + dc2bb0e commit ac08058

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

DFS/RemoveInvalidParentheses.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* Question Link: https://leetcode.com/problems/remove-invalid-parentheses/
3+
* Primary idea: Remove ) when the string is invalid, add to result when string is valid,
4+
* and do the same thing for the reversed one
5+
*
6+
* Time Complexity: O(n!), Space Complexity: O(n)
7+
*
8+
*/
9+
10+
class RemoveInvalidParentheses {
11+
func removeInvalidParentheses(_ s: String) -> [String] {
12+
var res = [String](), s = Array(s.characters)
13+
14+
dfs(&res, s, 0, 0, (Character("("), Character(")")))
15+
16+
return res
17+
}
18+
19+
private func dfs(_ res: inout [String], _ s: [Character], _ lastI: Int, _ lastJ: Int, _ parens: (Character, Character)) {
20+
var stack = 0, s = s
21+
22+
for i in lastI ..< s.count {
23+
if s[i] == parens.0 {
24+
stack += 1
25+
}
26+
if s[i] == parens.1 {
27+
stack -= 1
28+
}
29+
30+
if stack < 0 {
31+
for j in lastJ ... i {
32+
if s[j] == parens.1 && (j == lastJ || s[j - 1] != parens.1) {
33+
dfs(&res, Array(s[0 ..< j] + s[j + 1 ..< s.count]), i, j, parens)
34+
}
35+
}
36+
return
37+
}
38+
}
39+
40+
if parens.0 == "(" {
41+
dfs(&res, s.reversed(), 0, 0, (Character(")"), Character("(")))
42+
} else {
43+
res.append(String(s.reversed()))
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)