[ERT #5] A.良串(GOODSTRING)

该程序解决了一个字符串问题,目标是将包含a,b,c的字符串转换成良串(不包含abc和cba子串)。通过遍历字符串,找出可以形成abc或cba的子串并删除相应字符,计算最少需要删除的字符数。代码中使用了旗标变量来跟踪相邻的b字符,避免在只间隔一个字符的情况下删除两个字符。
摘要由CSDN通过智能技术生成

[ERT #5] A.良串(GOODSTRING)

题目描述

给定一个只含 a , b , c a,b,c a,b,c 的字符串,如果这个字符串不包含子串 a b c abc abc c b a cba cba,那么这个串就是良串(GOODSTRING),现在你可以删减一些字符,让一个串变成良串至少需要删几个字符?

输入格式

一行一个字符串,只包含 a , b , c a,b,c a,b,c

输出格式

一行一个数字,代表最少要删除几个字符这个串会变成良串。

样例 #1

样例输入 #1

abcba

样例输出 #1

1

样例 #2

样例输入 #2

abccba

样例输出 #2

2

样例 #3

样例输入 #3

abcbabcbabcba

样例输出 #3

3

样例 #4

样例输入 #4

acbbacbbbcbbacbcbabbaabcbabcbabcbabcbabaaabcba

样例输出 #4

6

提示

保证字符串的长度 ∣ S ∣ |S| S 满足:

  • 1 ≤ ∣ S ∣ ≤ 1 0 6 1 \le |S|\le10^6 1S106

样例解释

第一组数据删去第 3 3 3 个字符 c c c 成为良串。

第二组数据删去第 3 , 4 3,4 3,4 个字符 c , c c,c c,c 成为良串。

第三组数据删去第 3 , 7 , 11 3,7,11 3,7,11 个字符 c , c , c c,c,c c,c,c 成为良串。

思路:

1. abc和cba都是以b为中心的串 
2. 判断两个b之间的字符有几个
3. 对于中间只隔了一个字符的b 只需要删除一个字符就可以 所以不做处理 找下一个b 直到结尾

Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
	int ans = 0;
	char s[1000005] ;
	memset(s, '\0', sizeof(s));
	scanf("%s", s+1);				// 从第一个数开始赋值 
	
	int i, flag = 0;
	for(i = 2; i < strlen(s+1); i++){
		if(s[i] == 'b' && (s[i-1] == 'a' && s[i+1] == 'c' || s[i-1] == 'c' && s[i+1] == 'a'))		//找到b并且前后可以形成良串 
			if(!flag || flag+2 < i) ans++, flag = i; 			//如果两个b相隔一个字符 则只需删除一个字符 不做处理 找下一个b 
	}
	
	printf("%d", ans);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

时屿.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值