algorithm - 如何查找一串括号、大括号和方括号的有效性?

标签 algorithm string

我最近接触到这个有趣的问题。给你一个字符串,只包含字符 '(', ')', '{', '}''[' and ']',例如"[{()}]",需要写一个函数这将检查这样一个输入字符串的有效性,函数可能是这样的:
bool isValid(char* s);
这些括号必须以正确的顺序闭合,例如 "()""()[]{}" 都是有效的,但 "(]""([)]""{{{{" 不是!

我提出了以下 O(n) 时间复杂度和 O(n) 空间复杂度的解决方案,效果很好:

  1. 维护一堆字符。
  2. 每当您找到左大括号 '(''{''[' 时,将其压入堆栈。
  3. 每当您找到右大括号 ')''}'']' 时,检查堆栈顶部是否是相应的左括号, 如果是,则弹出堆栈,否则中断循环并返回 false。
  4. 重复步骤 2 - 3 直到字符串结束。

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

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

最佳答案

根据 Matthieu M. 的出色回答,这里是 C# 中的一个实现,看起来运行良好。

/// <summary>
/// Checks to see if brackets are well formed.
/// Passes "Valid parentheses" challenge on www.codeeval.com,
/// which is a programming challenge site much like www.projecteuler.net.
/// </summary>
/// <param name="input">Input string, consisting of nothing but various types of brackets.</param>
/// <returns>True if brackets are well formed, false if not.</returns>
static bool IsWellFormedBrackets(string input)
{
    string previous = "";
    while (input.Length != previous.Length)
    {
        previous = input;
        input = input
            .Replace("()", String.Empty)
            .Replace("[]", String.Empty)
            .Replace("{}", String.Empty);                
    }
    return (input.Length == 0);
}

本质上,它所做的只是删除成对的括号,直到没有要删除的为止;如果还有任何内容,则括号格式不正确。

格式正确的括号示例:

()[]
{()[]}

畸形括号示例:

([)]
{()[}]

关于algorithm - 如何查找一串括号、大括号和方括号的有效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2509358/

相关文章:

C sscanf 和字符串格式

c++ - 这个 c++ 反向字符串函数有什么问题

javascript - 为什么这个使用散列搜索字符串的函数不起作用?

java - 在 Java 中按多个属性对对象进行分组的一般方法

algorithm - 我们如何使用渐近复杂度计算算法的运行时间?

c - 查找从集合 A 中的点到集合 B 中的点的最短距离的算法

algorithm - 对已排序的多个项目进行二进制搜索

java - 如何使用分隔符按字符串(逐字而不是字符)从字符串数组 [] 中拆分字符串?

java - java 如何从txt文件中读取字符串并将其存储到字符数组中

c - 从排序的链表中删除重复元素