我刚刚解决了这个问题: 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,我想知道我的代码中的哪个操作成本太高,并以某种方式优化代码..
提前致谢..
答案 0 :(得分:0)
如果我正确地阅读您的问题,您需要重新考虑您的设计。无需搜索功能,无需erase
,substr
等。
首先,不要现在考虑[
或]
个字符。从空白字符串开始,并从原始字符串中添加字符。这是加速代码的第一件事。一个简单的循环是你应该开始的。
现在,在循环时,当您确实遇到这些特殊字符时,您需要做的就是更改&#34;插入点&#34;在您的输出字符串中,字符串的开头(在[
的情况下)或字符串的结尾(在]
的情况下)。
所以诀窍是不仅要在你进行的过程中构建一个新的字符串,还要将插入点更改为新的字符串。最初,插入点位于字符串的末尾,但如果遇到这些特殊字符,则会发生变化。
如果您不了解,可以不仅使用+=
或+
来构建字符串,还可以使用std::string::insert
函数。
例如,您总是以这种方式构建输出字符串:
out.insert(out.begin() + curInsertionPoint, original_text[i]);
curInsertionPoint++;
out
字符串是您正在构建的字符串,original_text
是您给出的输入。 curInsertionPoint
将从0开始,如果您遇到[
或]
字符,则会发生变化。 i
只是原始字符串的循环索引。
我不会发布任何更多信息,但你应该明白这一点。