3768.字符串删减

[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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时屿.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值