|  | @@ -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)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 |