|
@@ -0,0 +1,42 @@
|
|
|
+var empty struct{} = struct{}{}
|
|
|
+
|
|
|
+func removeInvalidParentheses(s string) (res []string) {
|
|
|
+ l, r := 0, 0
|
|
|
+ for _, c := range s {
|
|
|
+ if c == '(' {
|
|
|
+ l++
|
|
|
+ } else if c == ')' {
|
|
|
+ if l == 0 {
|
|
|
+ r++
|
|
|
+ } else {
|
|
|
+ l--
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ set := make(map[string]struct{})
|
|
|
+ dfs(&set, s, []byte{}, 0, l, r, 0)
|
|
|
+ for k, _ := range set {
|
|
|
+ res = append(res, k)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func dfs(set *map[string]struct{}, s string, pre []byte, pos, l, r, cnt int) {
|
|
|
+ n := len(s)
|
|
|
+ if pos == n && l == 0 && r == 0 && cnt == 0 {
|
|
|
+ (*set)[string(pre)] = empty
|
|
|
+ return
|
|
|
+ } else if cnt < 0 || l < 0 || r < 0 || pos == n {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if s[pos] == '(' {
|
|
|
+ dfs(set, s, pre, pos+1, l-1, r, cnt) // Delete '('
|
|
|
+ dfs(set, s, append(pre, '('), pos+1, l, r, cnt+1)
|
|
|
+ } else if s[pos] == ')' {
|
|
|
+ dfs(set, s, pre, pos+1, l, r-1, cnt) // Delete ')'
|
|
|
+ dfs(set, s, append(pre, ')'), pos+1, l, r, cnt-1)
|
|
|
+ } else {
|
|
|
+ dfs(set, s, append(pre, s[pos]), pos+1, l, r, cnt)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|