Longest Valid Parentheses

carlblack發表於2019-05-10

每日演算法——leetcode系列


問題 Longest Valid Parentheses

Difficulty: Hard

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

For "(()", the longest valid parentheses substring is "()", which has length = 2.

Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

class Solution {
public:
    int longestValidParentheses(string s) {
        
    }
};

翻譯

最長有效括號

難度係數:中等
給定一個僅僅包含`(``)`的字串,找出其中最長有效括號組成的子集的長度。
字串"(()",它的最長有效號符子集是"()",長度為2。
另一個例子")()())",它的最長有效括號子集是"()()",長度是4。

思路

假定:起始匹配位置startIndex=-1;最大匹配長度maxLen=0,當前遍歷的索引為i:
遍歷字串:
遍歷到的字元有兩種情況:

  • 當前字元為左括號,壓棧, startIdnex = i;

  • 當前字元為右括號

  1. 如果棧為空,表示沒有匹配的左括號,無任何操作

  2. 如果棧不空,出棧;

經過上面的第二步操作後,棧有兩種情況:

  • 棧空, 則i-startIndex為當前找到的匹配長度,檢查i-startIndex是否比maxLen
    更大,如果更大就更新maxLen;

  • 棧不空,則當前棧頂元素t是上次匹配的最後位置。,檢查i-t
    是否比ml更大,使得ml得以更新。

注:因為入棧的一定是左括號,顯然沒有必要將它們本身入
棧,應該入棧的是該字元在字串中的索引。

程式碼

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        size_t len = nums.size();
        if (len == 1 || len == 0){
            return;
        }
        int firstBreakNum = -1;
        size_t firstBreakIndex = -1;
        for (size_t i = len ;i > 1; --i){
            if (nums[i-1] > nums[i-2]){
                firstBreakNum = nums[i-2];
                firstBreakIndex = i - 2;
                break;
            }
        }
        // 沒找到打破升序規律的,那就全部升序排列
        if (firstBreakNum == -1){
            reverse(nums.begin(), nums.end());
            return;
        }
        for (size_t i = len; i > 1; --i){
            if (nums[i-1] > firstBreakNum){
                swap(nums[i-1], nums[firstBreakIndex]);
                break;
            }
        }
        auto iter = nums.begin();
        for (size_t i = 0; i < firstBreakIndex + 1; ++i){
            iter++;
        }
        reverse(iter, nums.end());
    }
};

還可以繼續優化

相關文章