例如:如果字符串是")(((())))))("
,则答案应为8。
我实施如下:(向他人学习)
int longestValidParentheses(string s) {
int len = s.length();
char* str = new char[len+1];
strcpy(str,s.c_str());
int maxlen=0;
stack<char*> stk;
char* cur = str;
while(*cur)
{
if(*cur=='(')
stk.push(cur);
else
{
if(!stk.empty() && *stk.top()=='(')
{
stk.pop();
maxlen = max(maxlen, cur-(stk.empty()?str-1:stk.top()));
}
else
stk.push(cur);
}
cur++;
}
return maxlen;
}
但我不知道为什么这段代码char* str = new char[len+1]
而不是char* str = new char[len]
。谁能告诉我为什么?如果我使用char* str = new char[len]
,则会发生错误。
答案 0 :(得分:1)
正如您从评论中可以看出的那样,您的问题在于您正在混合一些真正C++
的构造(如string
类型)与更典型的函数和数据类型C(如char*
,strcpy
等)。底线:字符串的长度是其中的字符数;但是所需的存储空间大于此,因为char*
类型的字符串具有终止'\0'
字符以指示&#34;字符串结束&#34;。如果你没有为此分配空间,那么在字符串复制操作结束时附加的'\0'
将覆盖另一个可能带来灾难性后果的内存位置。
答案 1 :(得分:1)
你不需要复制字符串就可以迭代它,因为string
带有非常好的迭代器,它完全像<{1}}一样 :
前10行可以替换为:
char*
如果您没有C ++ 11,请使用
int maxlen = 0;
auto cur = s.begin(), end = s.end();
std::stack<decltype(cur)> stk;
while (cur != end) {
取代std::string::iterator
和auto
。
还可以使用索引,甚至可以在字符串自己的内容中创建decltype(cur)
:
char*
在任何情况下都不要复制字符串然后泄漏它。
答案 2 :(得分:0)
Floris已经为您提供了问题的答案。让我添加一件事:你不必复制那个字符串。请注意,您正在分配一个缓冲区(new [len + 1]),并且您正在使用s.c_str()
来获取一个值。
检查什么是c_str!你复制到缓冲区的东西只是一个字符数组char*
,你可以完全适当地使用它,就像你的新缓冲区一样。试试吧:
int len = s.length();
char const* str = s.c_str();
它应该可以正常工作,而不必复制。 (也许你需要在几个地方添加一些功能)
答案 3 :(得分:0)
int longestValidParentheses(string s){
int pos = 0;
int maxlen = 0;
while(pos != -1){
pos = substr(pos).find("(");
if(str.substr(pos).find(")") == -1) pos = -1;
maxlen += 2;
pos++;
}
return maxlen;
}
如果您正在使用C ++,那么也可以使用您提供的工具。