牛客 nozomi和字符串(贪心)

题目链接:点击这里
在这里插入图片描述
在这里插入图片描述

贪心:最终的目的是得到连续相同子串,因此每次变换的目标一定是“比上一次变换得到的子串更长”,所以最终操作是连续的 1 1 0 0 或者 0 0 1 1

对于 1 1 0 0 的情况,可以分别统计每个 1 1 的前缀 1 1 和后缀 1 1 的位置(第一个 1 1 的前缀为 0 0 ,最后一个1的后缀为 n + 1 n+1 ),那么 k k 次操作,即变换连续 k k 个1,最终的字符串长度就是第 i i 1 1 的前缀 1 1 到第 i + k i+k 个后缀 1 1 之间的距离。

对于 0 0 1 1 的情况同理。

#include<bits/stdc++.h>
using namespace std;
string s;
vector<int> v0, v1;       //v0存字符'0'的坐标位置,v1存字符'1'的坐标位置

int main()
{ 
    int n, k, i, j;
    cin>>n>>k;
    cin>>s;
    v0.push_back(-1);
    v1.push_back(-1);
    
	for(i=0;i<n;i++)
	{
        if(s[i]=='0')	v0.push_back(i);
        else	v1.push_back(i);
    }
    
    v0.push_back(n);
    v1.push_back(n);
    
    int ma = 0;
    
    if(v0.size()-2<=k)		//若'0'的个数比k小,则可全修改为'1'
		ma = n;
    else
	{
        for(i = 1, j = k; j < v0.size()-1; i++, j++)
		{
            ma = max(ma, v0[j+1]-v0[i-1]-1);	//连续的k的'0'置'1' 
        }
    }
    
    if(v1.size()-2<=k)		//若'1'的个数比k小,则可全修改为'0'
		ma = n;
    else
	{
        for(i = 1, j = k; j < v1.size()-1; i++, j++)
		{
            ma = max(ma, v1[j+1]-v1[i-1]-1);	//连续的k的'1'置'0'
		}
    }
    cout<<ma;
}
发布了727 篇原创文章 · 获赞 111 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104214979
今日推荐