【leetcode】Longest Valid Parentheses

来源:互联网 发布:中国农产品进出口数据 编辑:程序博客网 时间:2024/06/07 12:09
#include<iostream>#include<stack>#include<vector>#include<string>#include<algorithm>using namespace std;struct Node{    int key;    char c;    Node(int key,char c):key(key),c(c){};};class Solution1{public:    int fun(string s)    {        stack<Node*>result;        int i=0;        vector<int>arr;        while(i<s.size())        {            Node *node=new Node(i,s[i]);            if(!result.empty())            {                char temp=result.top()->c;                if(juge(temp,s[i]))                {                    arr.push_back(result.top()->key);                    arr.push_back(i);                    result.pop();                }                else                    result.push(node);            }            else                result.push(node);                  i++;            }        /*while(!result.empty())        {            cout<<result.top()->key<<' '<<result.top()->c<<endl;            result.pop();        }*/        sort(arr.begin(),arr.end());        for(auto it=arr.begin();it!=arr.end();it++)            cout<<*it<<endl;        cout<<"*****"<<endl;        int max=1;        int max_id=0;        for(vector<int>::iterator i=arr.begin();i!=arr.end();i++)        {            auto j=i+1;            auto t=i;            int count=1;            for(;j!=arr.end();j++)            {                                                   cout<<*j<<endl;                cout<<*t<<endl;                if(1!=((*j)-(*t)))                    break;                else                {                    count++;                                }                t=j;                    }cout<<"HHH"<<endl;            if(max<count)            {                max=count;                max_id=*(j-1)-max+1;            }            if(j==arr.end())                break;            i=j-1;                  }        return max;    }    bool juge(char a,char b)    {        if(a=='('&&b==')'||a=='['&&b==']'||a=='{'&&b=='}')            return true;        else            return false;    }};class Solution2{public:    int fun(string s)    {        stack<int>result;        for(int i=0;i<s.size();i++)        {            if(s[i]=='(')                result.push(i);            else if(!result.empty())            {                s[result.top()]='$';                s[i]='$';                result.pop();            }        }        int length=0;        int max=0;        for(int i=0;i<s.size();i++)        {            if(s[i]=='$')            {                length++;                if(max<length)                    max=length;            }            else                length=0;        }        return max;    }};class Solution3{public:    int fun(string a)    {        stack<Node>result;        int max_id=0;        Node node=Node(-1,')');             result.push(node);        for(int i=0;i<a.size();i++)        {            Node node=Node(i,a[i]);            if(a[i]=='(')                result.push(node);            else            {                if(result.top().c=='(')                {                    result.pop();                    /*if(max<i-result.top().key)                        max=i-result.top().key;*/                    max_id=max(max_id,i-result.top().key);                }                else                    result.push(node);            }        }        return max_id;    }};class Solution4 {public:    int fun(string s)     {        int answer = 0, depth = 0, start = -1;        for (int i = 0; i < s.size(); ++i)        {            if (s[i] == '(')             {                ++depth;            }             else            {                --depth;                if (depth < 0)                 {                    start = i;                    depth = 0;                }                 else if (depth == 0)                 {                    answer = max(answer, i - start);                }            }        }        cout<<"answer"<<answer<<endl;        depth = 0;        start = s.size();        for (int i = s.size() - 1; i >= 0; --i)         {            if (s[i] == ')')            {            ++depth;            }             else             {                --depth;                if (depth < 0)                 {                    start = i;                    depth = 0;                }                else if (depth == 0)                 {                    answer = max(answer, start - i);                }            }        }        cout<<"answer"<<answer<<endl;        return answer;    }};void main(){    Solution1 solution;    string a("((()()");    cout<<"max="<<solution.fun(a);}
0 0
原创粉丝点击