给一个字符串,能在这个串中找到多少个bug?

比如说,在字符串 abcudg 中你可以找到一个 bug,它分别由字符串的第 2、4、6 个字符组成;再比如字符串 gducba,虽然它包含了 bug 这三个字符,但顺序不对,所以没有找到 bug。值得注意的是,每个字母只能用一次,也就是说,在字符串 bbuugg 中,只可以找到 2 个 bug,而不是 8 个。要输入一个仅包含小写字母的字符串,而且保证这个串的长度小于等于2e5,最后输出这个串里有多少个bug

话说我当年也是在学会使用“有限状态自动机”之后,才觉得自己的编程功力大增的。


#include <iostream>
#include <string>
using namespace std;
 
const int maxn = 200000;
int B[maxn], U[maxn], G[maxn];
int main(){
    string arr;
    cin >> arr;
    int b = 0, u = 0, g = 0;
 
    for(int i = 0; i < arr.length(); i++){
        if(arr[i] == 'b'){
            B[b++] = i;
        }
        else if(arr[i] == 'u'){
            U[u++] = i;
        }
        else if(arr[i] == 'g'){
            G[g++] = i;
        }
        }
     
    int i1 = 0, i2 = 0, i3 = 0, ans = 0;
    while(i1 < b && i2 < u && i3 < g ){
        while(B[i1] > U[i2] && i2 < u){ //如果不匹配就一直执行循环
            i2++;
        }
        if(i2 >= u){
            break;
        }
        while(U[i2] > G[i3] && i3 < g){ //如果不匹配就一直执行循环
            i3++;
        }
        if(i3 >= g){
            break;
        }
         
        ans++;
        i1++;
        i2++;
        i3++;
 
        //不能重复使用字母
    }
    cout << ans << endl;
    return 0;
}

话说我当年又过了10年后,是在“自创填表式编码风格”之后,才又觉得自己的编程功力巨增的。
https://bbs.csdn.net/topics/380157851


void aaaa(string s){           
    long long i=0;
    long long j=0;
    long long k=0;
    for(long long x=0;x<s.length();x++){
        if(s[x]=='b'){
            a[i]=x;
            i++;
        }else if(s[x]=='u'){
            b[j]=x;
            j++;
        }else if(s[x]=='g'){
            c[k]=x;
            k++;
        }
    }
    long long y=k>(i>j?i:j)?k:(i>j?i:j);
    long long sum=0;
    for(i=0,j=0,k=0;i<y&&j<y&&k<y;){
        if(a[i]<b[j]&&a[i]<c[k]&&b[j]<c[k]){
            //cout<<a[i]<<"\t"<<b[j]<<"\t"<<c[k]<<endl;
            sum++;
            i++;
            j++;
            k++;
        }else if(c[k]>a[i]&&c[k]>b[j]&&a[i]>b[j]){
            j++;
        }else if(b[j]>c[k]&&b[j]>a[i]&&c[k]>a[i]){
            k++;
        }else if(b[j]>a[i]&&b[j]>c[k]&&a[i]>c[k]){
            k++;
        }else if(a[i]>b[j]&&a[i]>c[k]&&b[j]>c[k]){
            j++;
            k++;
        }else if(a[i]>c[k]&&a[i]>b[j]&&c[k]>b[j]){
            j++;
            k++;
        }
    }
    cout<<sum<<endl;
}

#include <stdio.h>
char ln[200000+1],c;
int s,n,i;
int main() {
    fgets(ln,200000+1,stdin);
    s=0;
    n=0;
    i=0;
    while (1) {
        c=ln[i];
        if (c=='\n' || c==0) break;
        switch (s) {
        case 0: if (c=='b') {ln[i]='.';s=1;         } break;
        case 1: if (c=='u') {ln[i]='.';s=2;         } break;
        case 2: if (c=='g') {ln[i]='.';s=0;i=-1;n++;} break;
        }
        i++;
    }
    printf("%d",n);
    return 0;
}