package com.fishercoder.solutions; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Set; public class _301 { public static class Solution1 { public List<String> removeInvalidParentheses(String s) { List<String> result = new ArrayList<>(); if (s == null) { return result; } Set<String> visited = new HashSet(); Queue<String> q = new LinkedList(); q.offer(s); visited.add(s); boolean found = false; while (!q.isEmpty()) { String curr = q.poll(); if (isValid(curr)) { found = true; result.add(curr); } if (found) { continue;//this means if the initial input is already a valid one, we'll just directly return it and there's actually only one valid result } for (int i = 0; i < curr.length(); i++) { if (curr.charAt(i) != '(' && curr.charAt(i) != ')') { continue;//this is to rule out those non-parentheses characters } String next = curr.substring(0, i) + curr.substring(i + 1); if (!visited.contains(next)) { q.offer(next); visited.add(next); } } } return result; } private boolean isValid(String str) { char[] chars = str.toCharArray(); int count = 0; for (int i = 0; i < chars.length; i++) { char c = chars[i]; if (c == '(') { count++; } if (c == ')') { count--; if (count == -1) { return false; } } } return count == 0; } } }