尝试了解以下算法的运行时间问题; Error: Could not find or load main class mr.Driver
这是一个简单的BFS解决方案,通过删除"("或")"来生成所有可能的字符串。
Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results
从生成n个可能的字符串开始,下一个级别生成大小为n-1长度,n-2长度等的所有字符串.. 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;
}
示例
)()(
每个级别它检查所有可能的n级长度的字符串。 鉴于此 - 我很难弄清楚如何最终确定此算法的运行时间。如何推广此算法并分析复杂性?
答案 0 :(得分:0)
对于最坏的情况,让我们尝试输入为((((
。根据上面的逻辑,它会在队列中推送((((
,检查这是无效的。因此,它将生成另外4个长度为3的子串,将它们推入队列中。同样,在处理该队列元素时,它将再次为长度为3的每个子字符串生成更多长度为2的字符串,然后为2,然后结束。我们假设T(1)= 1。
如果您尝试为上述逻辑建立一个递归关系,那么它将是
T(n) = nT(n-1) + 1
,可以写成
= `n((n-1)T(n-2) + 1) + 1` and so on.
完全解决问题后,我们会T(n) = n! + n(n-1)/2 + 1
获得O(n!)
。
因此,我认为时间复杂度为O(n!)
有关如何解决递归关系T(n) = nT(n-1) + 1
的更多详细信息,请参阅:
this post on its solution