[3768.字符串删减](3768. 字符串删减 - AcWing题库)
给定一个由 n 个小写字母构成的字符串。
现在,需要删掉其中的一些字母,使得字符串中不存在连续三个或三个以上的 x
。
请问,最少需要删掉多少个字母?
如果字符串本来就不存在连续的三个或三个以上 x
,则无需删掉任何字母。
输入格式
第一行包含整数 n。
第二行包含一个长度为 n 的由小写字母构成的字符串。
输出格式
输出最少需要删掉的字母个数。
数据范围
3≤n≤100
输入样例1:
6
xxxiii
输出样例1:
1
输入样例2:
5
xxoxx
输出样例2:
0
输入样例3:
10
xxxxxxxxxx
输出样例3:
8
Code:(暴力枚举)
#include <stdio.h>
int main(){
int n;
scanf("%d\n", &n);
int i, len = 0, ans = 0;
for(i = 0; i < n; i++){
char ch; //临时字符
scanf("%c", &ch);
if(ch == 'x' && len < 3) len++; //读到x且连续x的len小于3个 len++
if(ch != 'x') len = 0; //读到非x 重置len
if(len == 3) len--, ans++; //len为3 去掉一个
}
printf("%d", ans);
return 0;
}
Code:(二分)
#include <stdio.h>
int max(int a, int b){
return a>b?a:b;
}
int main(){
int n;
scanf("%d\n", &n);
char str[105];
scanf("%s", str);
int res = 0;
int i, j;
for(i = 0; i < n; i++){ //二分
while(str[i] == 'x'){ //找一个x
j =i + 1;
while(str[j] == 'x' && j < n) j++; //找到每个x段的个数
res += max(j - i - 2, 0);
i = j + 1;
}
}
printf("%d", res);
return 0;
}