如何更快地删除我的字符串方式

时间:2017-03-16 19:40:08

标签: c++

我应该编写一个程序,其中包含“pre#ogrann ## mmink#g”之类的字符串并返回“编程”,就像你的退格按钮被打破一样,当你点击它时你会得到'#'而不是擦掉掉的小屋,我必须修理它。我在这里有工作代码,但它是慢的方式,我可能不得不处理大字符串,任何建议我怎么能更好/更快地做到这一点?

#include <string>
#include <iostream>

using namespace std;
int main() {


    string str;
    while(cin >> str) {
        bool done = false;
        while(!done) {
            if((int)str.find('#')>-1) {
                str.erase(str.find('#')-1, 2);
            } else {
                done = true;
            }
        }
        cout << str << endl;
    }
}

2 个答案:

答案 0 :(得分:3)

这是我将如何做到的。我没有对它进行测试以确定它是否实际上更快,但由于它具有 O(N)的复杂性,我认为它应该足够快:

while (std::cin >> input) {
    std::string result;
    result.reserve(input.length());

    for (auto ch : input) {
        if (ch == '#') {
            if (result.length() > 0)
                result.pop_back();
            continue;
        }

        result += ch;
    }

    std::cout << result << '\n';
}

答案 1 :(得分:0)

#include <iostream>
#include <string>

using namespace std;

string s = "pre#ogrann##mmink#g";


int main() {
  string out;
  int len = s.length();
  for (int i = 0; i < len; i++) {
    if(s[i] == '#') {
      s.erase(i-1,2);
      len = s.length();
      i -= 2;
    }
  }
  cout << s;
  return 0;
}

这会产生一个工作输出。