// Longest ().cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stack>
#include <string>
#include <list>
using namespace std;
struct nodeStruct
{
int startPos;
int endPos;
};
int longestValidParentheses(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
std::stack<int> gStack;
std::list<struct nodeStruct> gList;
int curMatchLen = 0;
int preStartingPos = -1;
int preEndingPos = -1;
int maxMatch = 0;
for (int idx = 0; idx < s.size(); idx++)
{
if (s.at(idx) == '(')
{
if (preStartingPos != -1 && preEndingPos != -1)
{
struct nodeStruct str;
str.startPos = preStartingPos;
str.endPos = preEndingPos;
gList.push_back(str);
preStartingPos = -1;
preEndingPos = -1;
}
gStack.push(idx);
}
else
{
if (!gStack.empty())
{
preEndingPos = idx;
preStartingPos = gStack.top();
gStack.pop();
}
}
}
if (preStartingPos != -1 && preEndingPos != -1)
{
struct nodeStruct str;
str.startPos = preStartingPos;
str.endPos = preEndingPos;
gList.push_back(str);
}
if (gList.size() != 0)
{
std::list<struct nodeStruct>::iterator curItr = gList.begin();
while (curItr != gList.end())
{
std::list<struct nodeStruct>::iterator nextItr = curItr;
++nextItr;
while (nextItr != gList.end())
{
if (curItr->endPos+1 == nextItr->startPos)
{
curItr->endPos = nextItr->endPos;
std::list<struct nodeStruct>::iterator tmpItr = nextItr;
++nextItr;
gList.erase(tmpItr);
}
else
{
++nextItr;
}
}
int curMatch = curItr->endPos-curItr->startPos+1;
if (curMatch > maxMatch)
{
maxMatch = curMatch;
}
++curItr;
if (nextItr != gList.end())
{
++nextItr;
}
}
}
return maxMatch;
}
int _tmain(int argc, _TCHAR* argv[])
{
int ret;
ret = longestValidParentheses(")(())(()()))(");
return 0;
}
07-20
07-20
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交