我希望能够获得string
并检查Parentheses
是否有效。
例如:
"(ew)[]" - this will be valid.
"(ew[)]" - this will be not valid.
这是我尝试过的:
public static bool CheckString(string input)
{
int braceSum = 0, squareSum = 0, parenSum = 0;
foreach (char c in input)
{
if (c == '{')
braceSum++;
if (c == '}')
braceSum--;
if (c == '[')
squareSum++;
if (c == ']')
squareSum--;
if (c == '(')
parenSum++;
if (c == ')')
parenSum--;
//check for negatives (pair closes before it opens)
if (braceSum < 0 || squareSum < 0 || parenSum < 0)
return false;
}
return (braceSum == 0 && squareSum == 0 && parenSum == 0);
}
因此,在两种情况下,我的代码都将返回true
。您对我需要添加什么才能使程序正确运行的任何建议吗?
答案 0 :(得分:11)
尝试基于经典Stack
的验证:
public static bool CheckString(string input) {
if (string.IsNullOrEmpty(input))
return true;
Stack<char> brackets = new Stack<char>();
foreach (var c in input) {
if (c == '[' || c == '{' || c == '(')
brackets.Push(c);
else if (c == ']' || c == '}' || c == ')') {
// Too many closing brackets, e.g. (123))
if (brackets.Count <= 0)
return false;
char open = brackets.Pop();
// Inconsistent brackets, e.g. (123]
if (c == '}' && open != '{' ||
c == ')' && open != '(' ||
c == ']' && open != '[')
return false;
}
}
// Too many opening brackets, e.g. ((123)
if (brackets.Count > 0)
return false;
return true;
}
演示:
string[] tests = new string[] {
"123",
"(123)",
"(1(23)",
"(12)3)",
"(ew)[]",
"(ew[)]",
"[12(34]56)",
};
string report = string.Join(Environment.NewLine, tests
.Select(test => $"{test,-10} : {(CheckString(test) ? "Valid" : "Invalid")}"));
Console.Write(report);
结果:
123 : Valid
(123) : Valid
(1(23) : Invalid
(12)3) : Invalid
(ew)[] : Valid
(ew[)] : Invalid
[12(34]56) : Invalid