[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 1≤∣S∣≤106
样例解释
第一组数据删去第 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;
}