zoukankan      html  css  js  c++  java
  • 32. 最长有效括号

    给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 

    示例 1:

    输入:s = "(()"
    输出:2
    解释:最长有效括号子串是 "()"
    示例 2:

    输入:s = ")()())"
    输出:4
    解释:最长有效括号子串是 "()()"
    示例 3:

    输入:s = ""
    输出:0

    #include<iostream>
    #include<stack>
    #include<algorithm>
    #include<string>
    #include<vector>
    using namespace std;
    /*
    用栈来求解,返回结果res,还需要用个变量 start 来记录合法括号串的起始位置,
    遍历字符串,如果遇到左括号,则将当前下标压入栈,
    如果遇到右括号,如果当前栈为空,则将下一个坐标位置记录到 start,
    如果栈不为空,则将栈顶元素取出,此时若栈为空,则更新结果和 i - start + 1 中的较大值,
    否则更新结果和 i - st.top() 中的较大值
    比如“(()”res =i - st.top()
    */
    class Solution {
    public:
    	int longestValidParentheses(string s) 
    	{
    		int res = 0;
    		int	start = 0;
    		int	n = s.size();
    		stack<int> st;
    		for (int i = 0; i < n; ++i) {
    			if (s[i] == '(')
    			{
    				st.push(i);
    			}
    			else if (s[i] == ')') 
    			{
    				if (st.empty())
    				{
    					start = i + 1;
    				}
    				else 
    				{
    					st.pop();
    					res = st.empty() ? max(res, i - start + 1) : max(res, i - st.top());
    				}
    			}
    		}
    		return res;
    	}
    };
    
    int main()
    {
    	string s1;
    	getline(cin, s1);
    	int ans = Solution().longestValidParentheses(s1);
    	cout << ans << endl;
    	system("pause");
    	return 0;
    }
    

      

    python版本

    def solution(str1:str)->int:
        #记录左括号的索引
        gost=[]
        # 记录右括号的索引
        man=[]
        for index in range(len(str1)):
            if str1[index]=='(':
                gost.append(index)
            elif str1[index]==')':
                #当遇到一个右括号时就 分别 消除 左括号、右括号的最后一个
                man.append(index)
                if gost:
                    gost.pop(-1)
                    man.pop(-1)
        #遍历下来   gost 里是未匹配 左括号的索引数组  man 里是未匹配 右括号的索引数组 
        #将其融合起来
        # 以  未匹配的 括号索引 将原字符串 进行分组, 最大的 子字符串长度 就是 所求 长度
        
        lensum=len(gost)+len(man)
        result=[]
        index1=index2=0
        print("gost",gost)
        print("man",man)
        while len(result)!=lensum:
            if index1<len(gost) and index2<len(man):
                if gost[index1]<man[index2]:
                    result.append(gost[index1])
                    index1 +=1
                else:
                    result.append(man[index2])
                    index2 += 1
            elif index1<len(gost):
                result.append(gost[index1])
                index1 += 1
            elif index2 < len(man):
                result.append(man[index2])
                index2 += 1
            else:
                break
        print('result : ',result)
        if len(result)==0:
            print(len(str1))
            return
        if result[0] !=0:
            result.insert(0,0)
        if result[-1]!=len(str1)-1:
            result.append(len(str1)-1)
        print(result)
        maxnum=0
        for i in range(len(result)-1):
            if result[i+1]-result[i]!=1:
                if maxnum<result[i+1]-result[i]:
                    maxnum=result[i+1]-result[i]
        if maxnum %2==1:
            maxnum -=1
        return maxnum
    

      

  • 相关阅读:
    Java工具类——UUIDUtils
    Python中的split()函数的用法
    学习笔记
    hdu 1558 线段相交+并查集
    hdu 4609 FFT
    hdu1402 FFT入门
    多项式乘法快速算法
    FFT
    GDUT校赛
    light oj 1236 分解质因数
  • 原文地址:https://www.cnblogs.com/277223178dudu/p/14855304.html
Copyright © 2011-2022 走看看