每日演算法——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;
-
當前字元為右括號
-
如果棧為空,表示沒有匹配的左括號,無任何操作
-
如果棧不空,出棧;
經過上面的第二步操作後,棧有兩種情況:
-
棧空, 則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());
}
};
還可以繼續優化