如何检查括号是否相同

时间:2016-02-07 22:13:04

标签: c#

我想检查输入字符串是否包含相同数量的打开/关闭括号。如果是,则打印出来,否则为false。我写过这段代码,但有人可以提供帮助吗?

See My Code 如果我输入一个字符串'()'从开放式括号开始,以紧密括号结束,但是如果我输入')('那么它仍然打印出来??输出应该是:

() = true
(())=true
()) = false
(() = false
)( = false
)(() = false 
etc...

感谢您的帮助

编辑:

 using System;

public class Program
{
  public  void Main()
 {

    CheckParentheses ("()");
 }

 public void CheckParentheses (string inputParentheses){

 int openParentheses  = 0;
 int closeParentheses = 0;
 for (int i = 0; i < inputParentheses.Length; i++)
 {
   if (inputParentheses[i] == '(') 
    {
        openParentheses++;
    }

     if (inputParentheses[i] == ')') {
        closeParentheses++;
     }


     if (openParentheses == closeParentheses) 

        Console.WriteLine("true");   

  }

 } 

}

4 个答案:

答案 0 :(得分:4)

您可以检查他们的订单

,而不是计算打开/关闭的父母
public void CheckParentheses(string inputParentheses)
{
    // Level counter
    int parenLevel = 0;
    for (int i = 0; i < inputParentheses.Length; i++)
    {
        // Open always good, increment the level
        if (inputParentheses[i] == '(')
            parenLevel++;
        else if (inputParentheses[i] == ')')
            parenLevel--;

        // Closing good, but only if the level doesn't drop under zero
        if (parenLevel < 0)
        {
            Console.WriteLine("false");
            return;
        }
    }
    // At the end of the loop, the level should always be zero
    if(parenLevel != 0)
        Console.WriteLine("false");
    else
        Console.WriteLine("true");
}

答案 1 :(得分:0)

如果有更多的已关闭而非开放,则应该返回错误,对吧?所以,你可以在循环的中间添加:

     if (closeParentheses > openParentheses) {
         Console.WriteLine("false");
     }

答案 2 :(得分:0)

public static bool CheckParentheses(string inputParentheses)
{
    if ( (inputParentheses.Length % 2) != 0 || inputParentheses[0] ==')' || inputParentheses[inputParentheses.Length-1] == '(')
        return false;

    for(int i = 0; i < inputParentheses.Length / 2; i++)
    {
        if(inputParentheses[i] != '(' || inputParentheses[inputParentheses.Length-i-1] != ')')
            return false;
    }
    return true;
}

答案 3 :(得分:0)

首先,我们必须清楚地了解我们试图证明字符串的属性。这需要一些时间,思想和想象力。

我们可以说字符串必须是S → "(" S ")" S | ε描述的语言的句子,在这种情况下我们的任务是创建一个解析器。当且仅当解析器接受它时,该字符串才有效。

另一种方法是解释&#34;(&#34; as push 和&#34;)&#34;作为堆栈的 pop ,按从左到右的顺序。然后,当且仅当表示的程序没有弹出空堆栈并且也以空堆栈结束时,该字符串才有效。我们可以通过运行程序并观察状态来测试它。

另一种方法是解释一串&#34;(&#34;和&#34;)&#34;作为&#34; 1&#34;的序列和&#34; -1&#34;分别。这类似于堆栈解释 - 通过Peano数字可以看出相似性。然后,当且仅当不存在小于零的前缀和且总和为零时,该字符串才有效。

我将解释如何在C#中实现整数解释。首先,开始定义函数,将字符串作为输入,将布尔答案作为输出。

bool AreParensBalanced(string input) { … }

首先将括号解释为整数。

var interpreted = input.Select(c => c == '(' ? 1 : -1);

接下来找到前缀总和。在这里,我搜索到IObservable,因为没有为IEnumerable定义扫描 - 您可以定义Scan for IEnumerable,但我宁愿利用现有的实现。

var prefixSums = interpreted.ToObservable().Scan(0, (a, b) => a + b).ToEnumerable()

现在找到总和。

var totalSum = interpreted.Aggregate(0, (a, b) => a + b);

知道前缀总和和总和,就可以找到答案。

return prefixSums.All(x => x >= 0) && totalSum == 0;

注意&#34;不存在x使得P(x)为真&#34;与&#34;相同,对于所有x,不是P(x)是真&#34;,这就是我从规范中提出All(x => x >= 0)的方法。