123456789101112131415161718192021222324252627282930313233343536373839404142 |
- 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)
- }
- }
|