在指定字符串中查找子序列(每个字母只用一次)

寻找 love
Description

给你一个字符串,需要你找出有多少个"love"子序列,每个字母只能用一次。

Input
一个字符串,长度小于200001

Output
字符串中,含有love子串的个数。

Sample Input 1

lovlovee
Sample Output 1

2

#include <iostream>
#include <string>
using namespace std;

const int maxn = 200000;
int L[maxn], O[maxn], V[maxn], E[maxn];
int main(){
    string arr;
    cin >> arr;
    int l = 0, o = 0, v = 0, e = 0;

    for(int i = 0; i < arr.length(); i++){
        if(arr[i] == 'l'){
            L[l++] = i;
        }
        else if(arr[i] == 'o'){
            O[o++] = i;
        }
        else if(arr[i] == 'v'){
            V[v++] = i;
        }
        else if(arr[i] == 'e'){
            E[e++] = i;
        }
    }
    int i1 = 0, i2 = 0, i3 = 0, i4 = 0, ans = 0;
    while(i1 < l && i2 < o && i3 < v && i4 < e){
        while(L[i1] > O[i2] && i2 < o){ //如果不匹配就一直执行循环
            i2++;
        }
        if(i2 >= o){
            break;
        }
        while(O[i2] > V[i3] && i3 < v){ //如果不匹配就一直执行循环
            i3++;
        }
        if(i3 >= v){
            break;
        }
        while(V[i3] > E[i4] && i4 < e){ //如果不匹配就一直执行循环
            i4++;
        }
        if(i4 >= e){
            break;
        }
        ans++;
        i1++;
        i2++;
        i3++;
        i4++;

        //不能重复使用字母
    }
    cout << ans << endl;
    return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值