Задача состоит в том, чтобы проверить, содержит ли данная строка сбалансированные наборы {}
, []
и ()
.Задача с фигурными скобками, скобками и скобками
Например, 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