自学内容网 自学内容网

数大雁,ranges容器统计每只大雁叫声的开始索引和结束索引,q统计大雁开始叫q的索引,统计最大交集数即可

#include<bits/stdc++.h>
using namespace std;
int solution(string s)
{
    deque<int> q;
    int u=0;
    int a=0;
    int c=0;
    vector<vector<int>> ranges;//ranges统计的是多只大雁的叫声区间,开始索引,结束索引
    for(int i=0;i<s.size();i++)
    {
    switch(s[i])//遍历s
    {
    case 'q':
        q.push_back(i);//记录起始索引q的下标
    case 'u':
        if(u+1<=q.size())
            u++;
    case 'a':
        if(a+1<=u)
            a++;
    case 'c':
        if(c+1<=a)
            c++;
    case 'k':
        if(c>=1)
        {
            ranges.emplace_back(vector<int>{q.front(),i});//{}里有两个int数据,说明第二维数组下标只有0,1。
            //ranges[0][0]=q.front,ranges[0][1]=i
            q.pop_front();
            u--;
            a--;
            c--;
        }
        break;//进入下一轮扫描
    default:
        return -1;
    }

    }
    if(ranges.empty())
        return -1;
    int maxcount=1;
    //求最大交集
    for(int i=0;i<ranges.size();i++)//第i个点开始的索引,不断更新最大索引
    {
        int countt=1;
        for(int j=i+1;j<ranges.size();j++)//从这个点开始真正扫描取交集
        {
            if(ranges[i][1]>ranges[j][0])//上个点的结束索引大于上个点的开始索引,那么交集+1
                 {
                     countt++;
                 }
            maxcount=max(countt,maxcount);//每一轮后countt归1,每次更新最大交集数
        }
    }
    return maxcount;

}
using namespace std;
int main()
{
    string s;
    cin>>s;
    cout<<solution(s)<<endl;
    return 0;
}
 


原文地址:https://blog.csdn.net/m0_57195330/article/details/145245142

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!