【发布时间】:2011-01-31 08:22:14
【问题描述】:
我最近接触到了这个有趣的问题。你得到一个只包含字符'('、')'、'{'、'}'、'['和']'的字符串,例如']',你需要编写一个检查有效性的函数对于这样的输入字符串,函数可能是这样的:
bool isValid(char* s);
这些括号必须以正确的顺序关闭,例如"()" 和"()[]{}" 都有效,但"(]"、"([)]" 和"{{{{" 无效!
我提出了以下 O(n) 时间和 O(n) 空间复杂度的解决方案,效果很好:
- 维护一堆字符。
- 只要找到左大括号
'('、'{'或'['就将其压入堆栈。 - 当你找到右大括号
')'、'}'或']'时,检查栈顶是否是对应的左括号,如果是,则弹出堆栈,否则中断循环并返回false。 - 重复步骤 2 - 3 直到字符串结束。
这可行,但是我们可以针对空间进行优化吗,可能是恒定的额外空间,我知道时间复杂度不能小于 O(n),因为我们必须查看每个字符。
所以我的问题是我们可以在 O(1) 空间中解决这个问题吗?
【问题讨论】:
-
很高兴你没有要求正则表达式……
-
您的算法似乎缺少一步。您弹出右大括号,但不要松开左大括号。
-
@Jeff B:右大括号甚至没有被压入堆栈。如果找到的右大括号对应于堆栈上的顶部左大括号,则仅将顶部左大括号弹出堆栈。
-
我认为我没有遗漏任何东西,我已经检查过了,它运行良好。我从来没有说过我弹出右大括号,见步骤 3,我说:右大括号是下一个标记,我检查它是否与当前堆栈顶部匹配,然后我弹出堆栈,意味着取出左大括号并扔掉它,然后我继续...
-
当你到达一个字符串的末尾时,你不应该检查堆栈是否为空吗?