Versuchen Sie, Laufzeit von unten Algorithmus für Problem zu verstehen; Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results
Ungültige Klammern Zeitkomplexität entfernen
Dies ist eine einfache BFS-Lösung, die alle möglichen Zeichenfolgen durch Entfernen von "(" oder ")" generiert.
public List<String> removeInvalidParentheses(String s) {
List<String> ret = new LinkedList<>();
Set<String> visited = new HashSet<>();
Queue<String> queue = new LinkedList<>();
queue.add(s);
while (!queue.isEmpty()) {
String current = queue.poll();
if (isValidParentheses(current)) {
ret.add(current);
}
if (ret.size() > 0) continue;
for (int i = 0; i < current.length(); i++) {
if (current.charAt(i) == '(' || current.charAt(i) == ')') {
String next = current.substring(0, i) + current.substring(i + 1);
if (!visited.contains(next)) {
visited.add(next);
queue.offer(next);
}
}
}
}
return ret;
}
public boolean isValidParentheses(String current) {
int open = 0;
int close = 0;
for (char c : current.toCharArray()) {
if (c == '(') open++;
else if (c == ')') close++;
if (close > open) return false;
}
return open == close;
}
Es beginnt mit erzeugen n möglich Strings und nächste Stufe es alle Strings mit einer Größe von n-1 Länge erzeugen, und n-2 Länge, etc .. für )()(
Beispiel
)()( len n
()( ))( ()( )() n-1
() ((() n-2
jede Ebene es prüft alle möglichen Strings mit n-Level Länge. angesichts dieser - Ich hatte schwer zu Zeit herauszufinden, wie die Laufzeit dieses Algorithmus finalisieren. Wie generalisiere ich diesen Algorithmus und analysiere die Komplexität?
von „invalid Klammern“ meinen Sie alle, die nicht geschlossen werden oder richtig geöffnet? Wenn dies der Fall ist, sollten Sie, da die Hierarchie der Klammern rekursiv ist, einen * Stack * verwenden, der * DFS * wäre und daher O (n) -Komplexität hätte – meowgoesthedog