@sashimee !stack.empty() is a substitution for stack.size() > 0 not a substitution for stack.size() > 1.
The stack does not start off empty. If the first character is ), stack.peek() is -1 and s.charAt(stack.peek()) will be s.charAt(-1) which will cause an error I think.

more specifically, in the original code, the stack.empty() && ss[stack.peek()] == ')' situation can only appear at the "root" level of braces, and there can be only one root level

yes, I think many solution that need O(n) space do not realize an very important property:
all invalid left parentheses must be at right side of all invalid right parentheses.
In fact, information those solution record is useless.

This looks like a very neat solution. Could you please explain what exactly the stack keeps track of and what start keeps track of? I know what's happening but what's the physical significance in words.