package com.interview.recursion; import java.util.*; /** * Date 03/03/2016 * @author Tushar Roy * * Remove the minimum number of invalid parentheses in order to make the input string valid. * Return all possible results * * Reference * https://leetcode.com/problems/remove-invalid-parentheses/ */ public class RemoveInvalidParenthesis { public List<String> removeInvalidParentheses(String s) { Set<String> res = new HashSet<>(); int rmL = 0, rmR = 0; for(int i = 0; i < s.length(); i++) { if(s.charAt(i) == '(') rmL++; if(s.charAt(i) == ')') { if(rmL != 0) rmL--; else rmR++; } } DFS(res, s, 0, rmL, rmR, 0, new StringBuilder()); return new ArrayList<String>(res); } public void DFS(Set<String> res, String s, int i, int rmL, int rmR, int open, StringBuilder sb) { if(i == s.length() && rmL == 0 && rmR == 0 && open == 0) { res.add(sb.toString()); return; } if(i == s.length() || rmL < 0 || rmR < 0 || open < 0) return; char c = s.charAt(i); int len = sb.length(); if(c == '(') { DFS(res, s, i + 1, rmL - 1, rmR, open, sb); DFS(res, s, i + 1, rmL, rmR, open + 1, sb.append(c)); } else if(c == ')') { DFS(res, s, i + 1, rmL, rmR - 1, open, sb); DFS(res, s, i + 1, rmL, rmR, open - 1, sb.append(c)); } else { DFS(res, s, i + 1, rmL, rmR, open, sb.append(c)); } sb.setLength(len); } public static void main(String args[]) { String s = "(r(()()("; RemoveInvalidParenthesis rmp = new RemoveInvalidParenthesis(); List<String> result = rmp.removeInvalidParentheses(s); result.forEach(s1 -> System.out.println(s1)); } }