301.remove-invalid-parentheses.go 927 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. var empty struct{} = struct{}{}
  2. func removeInvalidParentheses(s string) (res []string) {
  3. l, r := 0, 0
  4. for _, c := range s {
  5. if c == '(' {
  6. l++
  7. } else if c == ')' {
  8. if l == 0 {
  9. r++
  10. } else {
  11. l--
  12. }
  13. }
  14. }
  15. set := make(map[string]struct{})
  16. dfs(&set, s, []byte{}, 0, l, r, 0)
  17. for k, _ := range set {
  18. res = append(res, k)
  19. }
  20. return
  21. }
  22. func dfs(set *map[string]struct{}, s string, pre []byte, pos, l, r, cnt int) {
  23. n := len(s)
  24. if pos == n && l == 0 && r == 0 && cnt == 0 {
  25. (*set)[string(pre)] = empty
  26. return
  27. } else if cnt < 0 || l < 0 || r < 0 || pos == n {
  28. return
  29. }
  30. if s[pos] == '(' {
  31. dfs(set, s, pre, pos+1, l-1, r, cnt) // Delete '('
  32. dfs(set, s, append(pre, '('), pos+1, l, r, cnt+1)
  33. } else if s[pos] == ')' {
  34. dfs(set, s, pre, pos+1, l, r-1, cnt) // Delete ')'
  35. dfs(set, s, append(pre, ')'), pos+1, l, r, cnt-1)
  36. } else {
  37. dfs(set, s, append(pre, s[pos]), pos+1, l, r, cnt)
  38. }
  39. }