验证打开和关闭括号的数量

Verify the number of opening and closing brackets

本文关键字:验证      更新时间:2023-10-16

需要编写一个函数,以检查牙套在行中的有效性。如果开放括号对应于几乎相同的关闭,则该功能应返回true。输入字符串的示例:" (())) ()) ()"

发布了两个解决方案的变体。哪一个更好,还有一种更好的方法来解决问题?

1:

bool parenthesis(char myString[80]) {
    int k = 0;
    for (int i = 0; myString[i]; ++i) {
        if (myString[i] == '(')
            k++;
        if (myString[i] == ')')
            k--;
    }
    if (k == 0)
        return true;
    else
        return false;
}

2:

#include <algorithm>
#include <iostream>
#include <string>
int main()
{
    std::string str = "(()))())()";
    std::cout << std::boolalpha
              << (std::count(str.begin(), str.end(), '(') == 
                  std::count(str.begin(), str.end(), ')') && *str.begin() ==
                  '(' && *str.rbegin() == ')')
              << std::endl;
}

这很容易通过为(添加一个,为)减去一个,而小心的总和永远不会消失。最后,它必须为零。

两者似乎都不是最佳的,因为它们会有效字符串为

()))((()

我可能会做计数的事情,但请另外检查数字始终是非负的。

bool validate_parantheses(const std::string& str)
{
    int count = 0;
    for(char c : str)
    {
        if(c == '(')
            count++;
        else if(c == ')')
            count--;
        if(count < 0)
            return false;
    }
    return count == 0;
}    

解决方案1更可读,允许您更容易修复错误(在两个解决方案中)。请参阅添加的"返回false"。

bool parenthesis(char myString[80]) {
    int k = 0;
    for (int i = 0; myString[i]; ++i) {
        if (myString[i] == '(')
            k++;
        if (myString[i] == ')')
            k--;
        if (k<0) // This was missing from your original algorithm.
            return false;
    }
    if (k == 0)
        return true;
    else
        return false;

请注意,如果需要支持任何现实世界解析问题,例如不同类型的牙套:([[()]){} {} {{((())}}}

如果您遇到这样的问题,则提到的其他人可以更好地工作,因为您可以将开放式牙套推到堆栈上,当您找到近距离撑杆时,请将其弹出堆栈顶部并验证这是正确的类型。