需要编写一个函数来检查行中大括号放置的有效性。
如果左括号对应于大致相同的闭合,则该函数应返回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;
}
答案 0 :(得分:4)
这很容易做到只需为(
添加一个,为)
减去一个,同时注意总和永远不会消极。最后它必须为零。
答案 1 :(得分:3)
两者似乎都不是最佳的,因为它们会将字符串验证为
()))((()
我可能会做计数,但另外检查一下这个数字总是非负数。
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;
}
答案 2 :(得分:0)
解决方案1更具可读性,允许您更轻松地修复错误(在两个解决方案中)。请参阅添加的“return 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;
请注意,如果它需要支持任何真实的解析问题,例如不同类型的大括号,那将会更复杂:([[()]]){} {{(())}}
如果您有这样的问题,其他人提到的“堆栈”解决方案会更好用,因为您可以将打开的括号推到堆栈上,当您找到一个紧密的支撑时,从堆栈的顶部弹出打开并验证这是正确的类型。