删除无效的括号时间复杂度

时间:2017-07-09 23:23:11

标签: time-complexity

尝试了解以下算法的运行时间问题; 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级长度的字符串。 鉴于此 - 我很难弄清楚如何最终确定此算法的运行时间。如何推广此算法并分析复杂性?

1 个答案:

答案 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