首先讲述一下这道题的题意:
1.录入一段字符。
2.如果录入的是字符b,则删除该字符前面离该字符最近的小写字母,如果没有,则忽视。
3.如果录入的是字符B,则删除该字符前面离该字符最近的大写字母,如果没有,则忽视。
4.最后将剩下的字符打印出来,否则打印空行。
其次讲述一下我个人的做题思路:
1.首先肯定是创建一个字符数组arr来录取字符串。
2.之后便是遍历arr的每一个字符。
3.此时我创建了两个数组,brr,crr用于分别记录在arr中小写字母和大写字母的下标,并用flag1与flag2来记录数组的大小。
4.此时遍历有三种情况:
第一种:遍历到非B与b的其他字母,则将其下标记录到brr与crr中,并让flag自增。
第二种:遍历到b,此时,我用字符','来标记arr中b与B的位置以及被删除的字符的位置。如果flag1大于等于0,就让此时arr[brr[flag1]]等于',',并让flag1自减。
第三种:遍历到B,与二同理,代码如下:
5.最后就是把arr遍历跳过字符 ',' 输出。
6.提醒:别忘了换行哦。
下面是完整代码:
#include <iostream>
#include <algorithm>
using namespace std;
char arr[1000001] = { 0 };
int brr[1000001] = { 0 };
int crr[1000001] = { 0 };
int main() {
int t;
cin >> t;
while (t--) {
int flag1 = -1;
int flag2 = -1;
scanf("%s", &arr);
int l = strlen(arr);
for (int i = 0; i < l; i++) {
if (arr[i] == 'b') {
arr[i] = ',';
if (flag1 >= 0) arr[brr[flag1--]] = ',';
}
else if (arr[i] == 'B') {
arr[i] = ',';
if (flag2 >= 0) arr[crr[flag2--]] = ',';
}
else if (arr[i] >= 'a' && arr[i] <= 'z')brr[++flag1] = i;
else if (arr[i] >= 'A' && arr[i] <= 'Z')crr[++flag2] = i;
}
for (int i = 0; i < l; i++) {
if (arr[i] != ',')printf("%c", arr[i]);
}
printf("\n");
}
return 0;
}