任务是检查给定的字符串是否包含平衡集{}
,[]
和()
。带大括号,括号和括号的任务
例如,check("{[}]")
必须返回false
,并且check("{[]()}")
必须返回true
等
解决办法:
bool check(const std::string & s)
{
constexpr auto brackets1 = "()";
constexpr auto brackets2 = "[]";
constexpr auto brackets3 = "{}";
constexpr size_t brackets_pair_size = 2;
constexpr auto brackets = "()[]{}";
std::string s2;
for (auto & c : s)
{
if (strchr(brackets, c) != nullptr)
{
s2 += c;
}
}
auto brackets1_pos{ std::string::npos };
auto brackets2_pos{ std::string::npos };
auto brackets3_pos{ std::string::npos };
while ((brackets1_pos = s2.find(brackets1)) != std::string::npos ||
(brackets2_pos = s2.find(brackets2)) != std::string::npos ||
(brackets3_pos = s2.find(brackets3)) != std::string::npos
)
{
if (brackets1_pos != std::string::npos) {
s2.erase(brackets1_pos, brackets_pair_size);
continue;
}
if (brackets2_pos != std::string::npos) {
s2.erase(brackets2_pos, brackets_pair_size);
continue;
}
if (brackets3_pos != std::string::npos) {
s2.erase(brackets3_pos, brackets_pair_size);
continue;
}
}
return s2.empty();
}
思想是: - 所有收杆,括号和大括号复制到另一个字符串, - 从第二个字符串中删除成对的括号, - 检查第二个字符串是否为空。
有什么办法可以改进算法吗?
可能是一些普遍的正则表达式?
正则表达式对于嵌套结构并不是很好。另外,我会更适合http://codereview.stackexchange.com/。 –
@JoachimPileborg谢谢,不知道那个社区。 – vladon