Задача. В строке сосчитать количество всех открывающих (квадратных, круглых и фигурных) и закрывающих скобок. Если открывающих скобок на одну больше, добавить закрывающую круглую скобку в конец, а если открывающих скобок на одну меньше, то удалить последнюю закрывающую.
Тесты:
Ввод | Результат | Комментарий |
./main «({){« | «({){« | Пройдено |
./main «({}){« | «({}){)» | Пройдено |
./main «)]}]([[« | «)]}([[« | Пройдено |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { if(argc == 2){ string s(argv[1]); int counter = 0; for(int i = 0; i < s.size(); i++){ if(s[i] == '[' || s[i] == '(' || s[i] == '{') counter++; else if(s[i] == ']' || s[i] == ')' || s[i] == '}') counter--; } if(counter == 1){ s += ')'; }else if(counter == -1){ int _max = s.size(); for(int i = 0; i < s.size(); i++) if(s[i] == ']' || s[i] == ')' || s[i] == '}') _max = i; string stemp; for(int i = 0; i < _max; i++) stemp += s[i]; for(int i = _max+1; i < s.size(); i++) stemp += s[i]; s = stemp; } cout << s << endl; }else{ cout << "Ошибка ввода" << endl; } return 0; } |
Идея решения:
Сосчитать кол-во открывающих и закрывающих скобок в одну переменную. Если текущий символ — открывающая скобка, то прибавить к переменной единицу, если закрывающая скобка, то отнять единицу. Совершать проверку переменной на равенство 1 (если на одну открывающую скобку больше) или -1 (если на одну открывающую скобку меньше).
Точка в названии не ставится. Нет меток и рубрики.
Название исправлено, добавил метки и рубрику «строки string».
Принято
Игорь Евгеньевич, почему в Course Dashboard до сих пор нет оценки?
Уже поставил. Оценка снижена за неэффективный поиск последней закрывающей скобки и ключевые слова плохо идентифицирующие задачу.