G-eli和字符串

题目描述

eli拿到了一个仅由小写字母组成的字符串。

她想截取一段连续子串,这个子串包含至少 kkkkkkkkk 个相同的某个字母

她想知道,子串的长度最小值是多少?

注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串“arcaea”而言,“arc”、“rcae”都是其子串。而“car”、“aa”则不是它的子串。

输入描述:

第一行输入两个正整数 nnnnnnnnn 和 kkkkkkkkk(1≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤2000001 \le k \le n \le 2000001≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤2000001≤k≤n≤200000)

输入仅有一行,为一个长度为 nnnnnnnnn 的、仅由小写字母组成的字符串。

输出描述:

如果无论怎么取都无法满足条件,输出 −1−1−1−1-1−1−1−1−1 。

否则输出一个正整数,为满足条件的子串长度最小值。

示例1

5 2

abeba

3

说明:选择“beb”子串,长度为3,其中包含相同的两个’b’

思路如下

方法类似于“尺取法”,也可以认为是尺取法 或 双针法,其实大致思路都一样,只不过是实现的方法不一样,,,它们的主要思路是:

  1. 先找到一个符合题意的区间,在这一题中就是 含有 k 个相同字母的区间。
  2. 之后在 保证这个区间符合题意的基础上不断缩小区间范围,去找到更短的区间 的答案,当该区间在缩小完之后 不符和题意了,那么在扩大这个区间,使该区间在此符合题意,此时再次进行 2 这一步操作

题解一(尺取法?)

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
const int Len = 200005;
int barrel[Len];
char ar[Len]; int main()
{
//freopen("T.txt","r",stdin);
map<char , int> mp;
int n,k;
cin >> n >> k >> ar;
int l = -1, r = -1;
//尺取 找到一个合适的区间
for(int i = 0; i < n; i ++)
{
mp[ar[i]] ++;
if(mp[ar[i]] == k)
{
r = i;
break;
}
}
if(r == -1)
{
cout<< -1 << endl;
return 0;
}
//不断缩紧、扩大区间
int len = 1e9;
while(l < r && l < n - k && r < n)
{
while(mp[ar[r]] == k && l < r)
{
len = min(len , r - l);
l ++;
mp[ar[l]] --;
} r ++;
if(r == n) break;
mp[ar[r]] ++;
}
if(len == 1e9)
cout<<-1<<endl;
else
cout<<len<<endl; return 0;
}

题解如下(双针法? 前缀和?)

#include<iostream>
#include<string>
using namespace std;
const int Len = 2e5 + 5;
int dp[Len][26]; int main()
{
int n,k;
string s;
cin >> n >> k >> s; dp[0][s[0] - 'a'] = 1;
for(int i = 1; i < n; i ++)
{
for(int j = 0; j < 26; j ++)
{
dp[i][j] = dp[i - 1][j];
}
dp[i][s[i] - 'a'] ++;
} //先找到一个合适的区间
int min_len = 1e9;
for(int i = 0; i < 26; i ++)
{
int l = 0,r = 0;
if(dp[n - 1][i] < k) continue;
while(l < n && dp[l][i] == 0) l ++;
while(r < n && dp[r][i] < k) r ++;
min_len = min(min_len , r - l + 1); //对区间不断 扩大缩小范围
for(l ++; l < n; l ++)
{
if(s[l - 1] - 'a' == i)
{
r ++;
while(r < n && s[r] - 'a' != i) r ++;
if(r == n) break;
}
min_len = min(min_len , r - l + 1);
}
}
if(min_len != 1e9)
cout << min_len << endl;
else
cout << -1 << endl; return 0;
}

牛客寒假基础集训营 | Day1 G-eli和字符串的更多相关文章

  1. 牛客寒假基础集训营 | Day1 J题—u's的影响力(水题)

    Day1 J题-u's的影响力 有一天,kotori发现了一个和lovelive相似的游戏:bangdream.令她惊讶的是,这个游戏和lovelive居然是同一个公司出的! kotori经过一段时间 ...

  2. 牛客寒假基础集训营 | Day1 E-rin和快速迭代(暴力 + 优化)

    E-rin和快速迭代 题目描述 rin最近喜欢上了数论. 然而数论实在太复杂了,她只能研究一些简单的问题. 这天,她在研究正整数因子个数的时候,想到了一个"快速迭代"算法.设 f( ...

  3. 牛客寒假基础集训营 | Day1 D-hanayo和米饭

    D-hanayo和米饭 题目描述 hanayo很喜欢吃米饭. 有一天,她拿出了 nnnnnnnnn 个碗,第一个碗装了 111111111 粒米饭,第二个碗装了 222222222 粒米饭,以此类推, ...

  4. 牛客寒假算法基础集训营4 G Applese 的毒气炸弹

    链接:https://ac.nowcoder.com/acm/contest/330/G来源:牛客网 众所周知,Applese 是个很强的选手,它的化学一定很好. 今天他又AK了一套题觉得很无聊,于是 ...

  5. 牛客noip前集训营(第一场)提高T1

    链接:https://www.nowcoder.com/acm/contest/172/A来源:牛客网 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个 ...

  6. 2020牛客NOIP赛前集训营-普及组(第二场)A-面试

    面 试 面试 面试 题目描述 牛牛内推了好多人去牛客网参加面试,面试总共分四轮,每轮的面试官都会对面试者的发挥进行评分.评分有 A B C D 四种.如果面试者在四轮中有一次发挥被评为 D,或者两次发 ...

  7. 2020牛客NOIP赛前集训营-普及组(第二场) 题解

    目录 T1 面试 描述 题目描述 输入描述: 输出描述: 题解 代码 T2 纸牌游戏 描述 题目描述 输入描述: 输出描述: 题解 代码 T3 涨薪 描述 题目描述 输入描述: 输出描述: 题解 代码 ...

  8. 2020牛客寒假算法基础集训营5 G街机争霸

    题目描述 哎,又是银首,要是你这个签到题少WA一发就金了 牛牛战队的队员打完比赛以后又到了日常甩锅的时间.他们心情悲伤,吃完晚饭以后,大家相约到一个街机厅去solo.牛牛和牛能进入了一个迷宫,这个迷宫 ...

  9. 2020牛客寒假算法基础集训营3 G.牛牛的Link Power II (树状数组维护前缀和)

    https://ac.nowcoder.com/acm/contest/3004/G 发现每个“1”对于它本身位置产生的影响贡献为0,对前面的“1”有产生贡献,对后面的"1"也产生 ...

随机推荐

  1. Webpack和Gulp,Webpack和Gulp的基本区别:

    Gulp和Webpack的基本区别: gulp可以进行js,html,css,img的压缩打包,是自动化构建工具,可以将多个js文件或是css压缩成一个文件,并且可以压缩为一行,以此来减少文件体积,加 ...

  2. Sequence to Sequence Learning with Neural Networks论文阅读

    论文下载 作者(三位Google大佬)一开始提出DNN的缺点,DNN不能用于将序列映射到序列.此论文以机器翻译为例,核心模型是长短期记忆神经网络(LSTM),首先通过一个多层的LSTM将输入的语言序列 ...

  3. CODING 携手优普丰,道器合璧打造敏捷最佳实践

    随着全球进入到信息化时代,越来越多的企业迫切地寻求新的商业模式,要求迭代.探索.不断加速创新以响应快速变化的市场.如今一系列新兴概念如敏捷开发.极限编程.微服务.自动化.DevOps 等大行其道,然而 ...

  4. python爬虫的数据库连接问题

    1.需要导的包 import pymysql 2.# mysql连接信息(字典形式) db_config ={ 'host': '127.0.0.1',#连接的主机id(107.0.0.1是本机id) ...

  5. c++第二周阶段小测2

    函数参数已完成(全部是正确答案)     1 [单选题] 以下关于函数参数的说法,不正确的是   A. 函数调用时,先将实参的值按照位置传递给对应的形参. B. 实参与形参的个数及顺序不必一一对应. ...

  6. 测试必知必会系列- Linux常用命令 - history

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 查看历 ...

  7. Java 并发容器(转)

    转自:https://blog.ouyangsihai.cn/%2Fjava-gao-bing-fa-zhi-bing-fa-rong-qi-xiang-jie-cong-ru-men-dao-cha ...

  8. Python习题集(十六)

    每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 写一个函数repl ...

  9. Core3.1WebApi_ 同源策略_如何支持跨域(转载)

    原文:https://mp.weixin.qq.com/s/id3fOyGrZI9lLx7PKbVYlg

  10. Leetcode_877. 石子游戏(区间dp)

    偶数堆石子,只能从首尾取,取多的赢. 每次操作会产生两个子状态,区间dp,记得先枚举长度. code class Solution { public: int dp[505][505]; bool s ...