Задачи
May 8
Задача. Глубина скобок
Строка является валидной строкой с круглыми скобками, если она удовлетворяет одному из следующих условий:
- Это пустая строка "" или одиночный символ, не равный "(" или ")".
- Она может быть записана как AB (A, конкатенированное с B), где A и B - валидные строки со скобками.
- Можно записать как (A), где A - валидная строка со скобками.
Для заданной строки S верните глубину вложенности скобок.
1. S = "(1+(2*3)+((8)/4))+1"
Output: 3
2. S = "(1)+((2))+(((3)))"
Output: 3
Разбор
В данной задачи глубина любого символа будет определятся по следующей формуле: (количество открывающихся скобок слева от символа) - (количество закрывающихся скобок слева от символа).
S = "(1+(2*3)+((8)/4))+1" - "1": (1 - 0) = 0; - "2": (2 - 0) = 2; - "3": (2 - 0) = 2; - "8": (4 - 1) = 3; - "4": (4 - 2) = 2; - "1": (0 - 0) = 0;
Максимальная глубина 3 для символа "8".
Тогда алгоритм будет довольно простой.
- В цикле проходим по исходной строке и на каждой итерации:
- увеличиваем счетчик, если встретили открывающуюся скобку;
- уменьшаем счетчик, если встретили закрывающуюся скобку. - Определяем максимальную глубину, используя текущее значение счетчика.
Реализация
static int FindMaxDepth(string s) { int depth = 0; int curDepth = 0; for (int i = 0; i < s.Length; i++) { if (s[i] == '(') { curDepth++; } else if (s[i] == ')') { curDepth--; } depth = Math.Max(depth, curDepth); } return depth; }
https://gist.github.com/unilecs/e6950404e6328cbc6a517b379ba1b8a1