給定只含 '(' 和 ')' 的字符串,求最長合法括號子串長度。例:"(()" → 2,")()())" → 4。
棧存未匹配的左括號索引,輔助變量 start = -1 記錄「上一個未匹配右括號的位置」。遍歷字符串:
'(':索引入棧')':
i - start;若棧非空 → 長度 = i - stack.top()start = ipublic int longestValidParentheses(String s) {
if (s == null || s.isEmpty()) return 0;
Deque<Integer> stack = new ArrayDeque<>();
int start = -1, maxLen = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push(i);
} else {
if (!stack.isEmpty()) {
stack.pop();
if (stack.isEmpty()) maxLen = Math.max(maxLen, i - start);
else maxLen = Math.max(maxLen, i - stack.peek());
} else {
start = i;
}
}
}
return maxLen;
}
start 標記「最後一個無法匹配的右括號」,作為有效子串的左邊界start+1 到 i 完全匹配O(N),空間 O(N)DP 定義 dp[i] = 以 i 結尾的最長有效長度,轉移較繁瑣。棧法更直觀、代碼更短。