summary:
divide and conquer | state transition
package myapp.kit.leetcode.top100liked;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 301
* hard
* https://leetcode.com/problems/remove-invalid-parentheses/
*
* Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.
*
* Note: The input string may contain letters other than the parentheses ( and ).
*
* Example 1:
*
* Input: "()())()"
* Output: ["()()()", "(())()"]
* Example 2:
*
* Input: "(a)())()"
* Output: ["(a)()()", "(a())()"]
* Example 3:
*
* Input: ")("
* Output: [""]
*
* @author huangdingsheng
* @version 1.0, 2020/5/20
*/
public class RemoveInvalidParentheses {
//"(((k()(("
Map<Integer, List<String>> map = new HashMap<>();
Set<String> visited = new HashSet<>();
int max = 0;
public List<String> removeInvalidParentheses(String s) {
List<String> list = new ArrayList<>();
list.add("");
if (s == null || s.length() == 0) {
return list;
}
process(s, s.length() - 1, 0, 0);
if (map.size() == 0) {
return list;
}
return map.get(max);
}
private void process(String s, int idx, int lCn, int rCn) {
if (s.length() == 0) {
return;
}
// pruning
if (s.length() < max || visited.contains(s)) {
return;
}
if (idx < 0) {
// validate
if (lCn != rCn) {
return;
}
visited.add(s);
if (map.containsKey(s.length())) {
List<String> list = map.get(s.length());
list.add(s);
} else {
List<String> list = new ArrayList<>();
list.add(s);
map.put(s.length(), list);
}
max = Math.max(max, s.length());
return;
}
// state transition
if (s.charAt(idx) == '(') {
if (rCn == lCn) {
process(s.substring(0, idx) + s.substring(idx + 1), idx - 1, lCn, rCn);
} else {
process(s, idx - 1, lCn + 1, rCn);
process(s.substring(0, idx) + s.substring(idx + 1), idx - 1, lCn, rCn);
}
} else if (s.charAt(idx) == ')') {
process(s, idx - 1, lCn, rCn + 1);
process(s.substring(0, idx) + s.substring(idx + 1), idx - 1, lCn, rCn);
} else {
process(s, idx - 1, lCn, rCn);
}
}
}