我想检查输入字符串是否包含相同数量的打开/关闭括号。如果是,则打印出来,否则为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");
}
}
}
答案 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)
的方法。