查找最长有效括号(leetcode)

时间:2013-09-12 21:35:22

标签: c++ char

例如:如果字符串是")(((())))))(",则答案应为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],则会发生错误。

4 个答案:

答案 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 ++,那么也可以使用您提供的工具。