小编典典

如何找到括号,大括号和方括号的字符串的有效性?

algorithm

我最近遇到了这个有趣的问题。您将获得只包含字符的字符串'('')''{''}''['']',例如"[{()}]",你需要写这将检查这些输入字符串的有效性的函数,函数可能是这样的:
bool isValid(char* s);
这些支架必须关闭以正确的顺序,例如"()""()[]{}"都是有效的,但是"(]""([)]"并且"{{{{"都没有!

我提出了以下O(n)时间和O(n)空间复杂度解决方案,该方法运行良好:

  1. 保持一堆字符。
  2. 每当您发现开口花括号时'(''{''['将其推入堆栈中。
  3. 无论何时你发现右括号')''}'']'如果堆栈的顶部对应的开口支架,检查,如果是,则弹出堆栈,否则打破循环和返回FALSE。
  4. 重复步骤2-3,直到字符串结尾。

这行得通,但是我们可以针对空间进行优化吗?可能是恒定的额外空间,我理解时间复杂度不能小于O(n),因为我们必须查看每个字符。

所以我的问题是我们可以在O(1)空间解决这个问题吗?


阅读 228

收藏
2020-07-28

共1个答案

小编典典

实际上,由于Ritchie和Springsteel,有一种确定性的日志空间算法:http
~~//dx.doi.org/10.1016/S0019-99587290205-7收费墙,抱歉,~~
不在网上)。由于我们需要日志位来索引字符串,因此这是空间最佳的。

如果您愿意接受单方面的错误,那么有一种算法可以使用n个polylog(n)时间和polylog(n)空间:http : //www.eccc.uni-trier.de/report/2009/119
/

2020-07-28