首页 > 解决方案 > 为什么 erase() 函数只有第一次才能正常工作?

问题描述

我正在尝试使用 erase() 函数从字符串中删除特定字符,但它不起作用。

问题是您必须删除“AB”或“BB”的子字符串。当子字符串从字符串中删除时,字符串的其余部分将连接起来,并且该过程继续......

这是代码:

#include <bits/stdc++.h>

#define ios ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

#define int long long int

using namespace std;

int32_t main()
{

    ios;
    int t;
    cin>>t;

    while(t--)
    {
        string s;
        cin>>s;
        int i;
        for(i=0;i<s.length();i++)
        {
            if(s[i]=='A'&&s[i+1]=='B')
            {
                s.erase(i,i+1);
                cout<<s<<"\n";
                i=-1; // I want to start from begining therefore initializing i=-1 after i++ it becomes i=0;
            }                                        
            else if(s[i]=='B'&&s[i+1]=='B')
            {
                s.erase(i,i+1);
                cout<<s<<"\n";
                i=-1;
            }
        }
        //cout<<s.length()<<"\n";
    }
    return 0;
}

输入:

1
AABBBABBBB

输出是:

ABBABBBB

BBABBBB

BABBBB

BBBB

BBB

BB

B

但输出应该是:

ABBABBBB

BABBBB

BBBB

BB

难道我做错了什么?

标签: c++c++14erase

解决方案


您可以将两个s.erase(i, i + 1);语句更改为s.erase(i, 2);.

1
AABBBABBBB
ABBABBBB
BABBBB
BBBB
BB

你可以使用 C++ STL。

#include <vector>
#include <iostream>
#include <string>

int main() {

    int t{0};
    std::cin >> t;

    while (t--) {
        std::string s{};
        std::cin >> s;
        for (auto i = 0; i < s.length() && i + 1 < s.length(); i++) {
            if (s[i] == 'A' && s[i + 1] == 'B') {
                s.erase(i, 2);
                std::cout << s << std::endl;
                i = -1;
            } else if (s[i] == 'B' && s[i + 1] == 'B') {
                s.erase(i, 2);
                std::cout << s << std::endl;
                i = -1;
            }
        }
    }

    return EXIT_SUCCESS;
}

推荐阅读