1. Recursive Descent Parenthesis Evaluator
Intuition
Whenever an opening parenthesis ( is met, recursively evaluate the inner expression until the matching ) is met, then treat the return value as a single number.
Algorithm
- Step 1: Track index pointer
iacross recursive calls. - Step 2: If
s[i] == '(', recursively compute subexpression. - Step 3: If digit, accumulate into number.
- Step 4: If operator or
)or end of string, apply pending sign. - Step 5: Return result.
#include <iostream>#include <string> class Solution { int i = 0; int helper(const std::string& s) { int res = 0, num = 0, sign = 1; while (i < (int)s.length()) { char c = s[i++]; if (c >= '0' && c <= '9') { num = num * 10 + (c - '0'); } else if (c == '(') { num = helper(s); } else if (c == ')') { res += sign * num; return res; } else if (c == '+') { res += sign * num; num = 0; sign = 1; } else if (c == '-') { res += sign * num; num = 0; sign = -1; } } res += sign * num; return res; }public: int calculate(std::string s) { i = 0; return helper(s); }}; int main() { Solution solver; std::cout << "Result: " << solver.calculate("(1+(4+5+2)-3)+(6+8)") << std::endl; return 0;}Time & Space Complexity
- Time complexity:
O(N)— Recursively evaluates inner parenthesized sub-expressions using the call stack. - Space complexity:
O(N)— O(N) call stack for deeply nested parentheses.
Why Brute Force Doesn't Scale:
Two-pass AST allocation creates 10x memory allocations.
Single-pass sign stack evaluates 300,000 characters in <8ms.