1. 程式人生 > >leetcode打卡 Longest Valid Parentheses

leetcode打卡 Longest Valid Parentheses

題目

Given a string containing just the characters'(' and')', find the length of the longest valid (well-formed) parentheses substring.

大意就是:給定一個只包含 '('')' 的字串,找出最長的包含有效括號的子串的長度。 示例1:

Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"

示例2

Input: ")()())"
Output: 4
Explanation: The longest valid parentheses substring is "()()"

注:類似(())也是有效匹配,長度為4

分析

該題在leetcode動態規劃的分類下,所以我們可以使用動態規劃來解決該問題。我們可以使用一個數組arr來記錄字串s在下標i的位置時,其有效長度為多少。

  • s[i] == '(', arr[i] = 0
  • s[i] == ')',需要分兩種情況來討論
    • s[i-1]=='('時,很明顯arr[i] = arr[i-2] + 2,因為此時有效子串的長度多增加了一對括號(),即有效子串長度+2
    • s[i-1]==')'時。考慮這樣的情況,假設sub = "((......))"是給定字字串的一部分,且為有效子串。那麼arr[i]的值為sub字串的長度
      +sub前一個下標(記為j)的對應的arr的值,即arr[i] = len(sub) + arr[j]。那麼sub的長度和j該如何計算呢?我們仔細觀察一下,因為sub是有效子串,所以len(sub) = arr[i-1] + 2j = i - arr[i-1] - 2。(這樣強行解釋一波不知道行不行得通

程式碼

class Solution {
public:
    int longestValidParentheses(string s) {
        if(s.size() == 0) {
            return 0;
        }
        int max =
0; int arr[s.size()] = {0}; for(int i = 0; i < s.size(); ++i) { if(s[i] == ')' && i > 0) { if(s[i-1] == '(') { arr[i] = i >= 2 ? arr[i-2] + 2 : 2; } else if(i - arr[i - 1] > 0 && s[i - arr[i - 1] - 1] == '(') { arr[i] = arr[i-1] + (i - arr[i-1] -2 >= 0 ? arr[i - arr[i-1] -2]:0) + 2; } } if(arr[i] > max) { max = arr[i]; } } return max; } };