想要优化这个字符串操作程序c ++

时间:2015-05-09 16:18:55

标签: c++ string

我刚刚解决了这个问题: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3139

这是我的解决方案: https://ideone.com/pl8K3K

int main(void) 
{
    string s, sub;
    int f,e,i;

    while(getline(cin, s)){
        f=s.find_first_of("[");

        while(f< s.size()){
            e= s.find_first_of("[]", f+1);
            sub = s.substr(f, e-f);
            s.erase(f,e-f);
            s.insert(0, sub);
            f=s.find_first_of("[", f+1);
        }

        for(i=0; i<s.size(); i++){
            while((s[i]==']') || (s[i]=='[')) s.erase(s.begin()+i);
        }

        cout << s << endl;
    }
    return 0;
}

我得到了TLE,我想知道我的代码中的哪个操作成本太高,并以某种方式优化代码..

提前致谢..

1 个答案:

答案 0 :(得分:0)

如果我正确地阅读您的问题,您需要重新考虑您的设计。无需搜索功能,无需erasesubstr等。

首先,不要现在考虑[]个字符。从空白字符串开始,并从原始字符串中添加字符。这是加速代码的第一件事。一个简单的循环是你应该开始的。

现在,在循环时,当您确实遇到这些特殊字符时,您需要做的就是更改&#34;插入点&#34;在您的输出字符串中,字符串的开头(在[的情况下)或字符串的结尾(在]的情况下)。

所以诀窍是不仅要在你进行的过程中构建一个新的字符串,还要将插入点更改为新的字符串。最初,插入点位于字符串的末尾,但如果遇到这些特殊字符,则会发生变化。

如果您不了解,可以不仅使用+=+来构建字符串,还可以使用std::string::insert函数。

例如,您总是以这种方式构建输出字符串:

    out.insert(out.begin() + curInsertionPoint, original_text[i]);
    curInsertionPoint++;

out字符串是您正在构建的字符串,original_text是您给出的输入。 curInsertionPoint将从0开始,如果您遇到[]字符,则会发生变化。 i只是原始字符串的循环索引。

我不会发布任何更多信息,但你应该明白这一点。