c++ - 为什么 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
难道我做错了什么?
解决方案
您可以将两个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;
}
推荐阅读
- floating-point - 如何以最大精度将 5 个浮点数平均编码为 4 个浮点数
- c# - 使用用户定义类型从 .net 调用 oracle 存储过程时出现问题
- python - Python 密码检查程序 - 与 .pop() 值的比较不起作用
- python - 正则表达式拆分缩写名字的大写字母和句点的组合
- sql - 通过 cmd 面板使用本地 .bak 文件恢复在线 SQL Server 数据库
- java - 为什么需要使用 Set 覆盖 equals() 和 hashcode() 进行多值关联?
- java - 如何将 f(x) 作为用户输入并使其像使用 java 代码的公式一样工作?
- uwp-xaml - UWP XAML:Bindings.Update() 不会触发内部项目
- javascript - 允许任何拥有sails 政策的人访问API
- sqlite - SQLite SUM 返回整数?