Задачи
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".

Тогда алгоритм будет довольно простой.

  1. В цикле проходим по исходной строке и на каждой итерации:
    - увеличиваем счетчик, если встретили открывающуюся скобку;
    - уменьшаем счетчик, если встретили закрывающуюся скобку.
  2. Определяем максимальную глубину, используя текущее значение счетчика.

Реализация

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

Play-test

https://dotnetfiddle.net/68R5Gl