2015-05-09 40 views
-3

我剛剛解決這個問題: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3139要優化這個字符串處理程序C++

這裏是我的解決方案: 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

這個問題更適合[codereview](http://codereview.stackexchange.com/) –

+0

您可以對自己的程序進行性能評估嗎? – 2015-05-09 16:24:31

+0

我投票結束這個問題作爲題外話題,因爲它是關於代碼審查。 – Achrome

回答

0

如果我正確閱讀你的問題,你需要重新考慮你的設計。沒有必要對功能進行搜索,無需erasesubstr

首先,不要去想[]字符現在。從一個空白字符串開始,並從原始字符串向它添加字符。這是加速你的代碼的第一件事。一個簡單的循環就是你應該開始的。現在,在循環時,如果實際上遇到這些特殊字符,則只需將輸出字符串中的「插入點」更改爲字符串的開頭(在[的情況下)或者字符串的結尾(在]的情況下)。

所以訣竅是不僅要隨着時間的推移建立一個新的字符串,還要將插入點改爲新的字符串。最初,插入點位於字符串的末尾,但如果遇到這些特殊字符,則會改變。

如果您不知道,可以通過使用+=+而不是使用std::string::insert函數來構建字符串。

因此,例如,你總是建立你的輸出字符串是這樣的:

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

out字符串是你正在構建的字符串時,original_text是你給予的輸入。 curInsertionPoint將從0開始,如果遇到[]字符,將會更改。 i僅僅是原始字符串的循環索引。

我不會發布任何比這更多,但你應該明白了。