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. Java锁的理解

    目录: 1.为什么要使用锁? 2.锁的类型? 1.为什么要使用锁? 通俗的说就是多个线程,也可以说多个方法同时对一个资源进行访问时,如果不加锁会造成线程安全问题.举例:比如有两张票,但是有5个人进来买 ...

  2. IOS 项目release版本中关闭NSlog的打印

    在-Prefix.pch文件中添加如下代码: #ifdef DEBUG #define NSLog(...) NSLog(__VA_ARGS__) #define debugMethod() NSLo ...

  3. ElasticSearch 6.2.4 实践

    参考资料 ElasticSearch 官网 ElasticSearch,Kibana,Asp.net Core with docker 示例 阮一峰 ElasticSearch 基础概念 索引(ind ...

  4. MySQL 统计行数的 count

    MySQL count() 函数我们并不陌生,用来统计每张表的函数.但如果你的表越来越大,并且是 InnoDB 引擎的话,会发现计算的速度会越来越慢.在这篇文章里,会先介绍 count() 实现的原理 ...

  5. The Game Of Life – 数据结构与算法的敲门砖

    The Game Of Life(生命游戏,又称为细胞自动机)几乎是所有数据结构与算法导论教程前言的一个很经典的程序了.这是一个零玩家游戏,发生在一个平面网格里.每个格子的细胞都有死亡和存活两种状态, ...

  6. Proteomic Profiling of Paired Interstitial Fluids Reveals Dysregulated Pathways and Salivary NID1 as a Biomarker of Oral Cavity Squamous Cell Carcinoma (解读人:张聪敏)

    文献名:Proteomic Profiling of Paired Interstitial Fluids Reveals Dysregulated Pathways and Salivary NID ...

  7. Django ajax的简单使用、自定义分页器

    一. ajax初识 1. 前后端传输数据编码格式contentType 使用form表单向后端提交数据时,必须将form表单的method由默认的get改为post,如果提交的数据中包含文件,还要将f ...

  8. [模板] trie树 (字典树)

    本文基于https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html #include<bits/stdc++.h> using name ...

  9. docker image换包步骤

    Docker Commit 1.在IDEA中通过maven package得到watchman-1.5.0-SNAPSHOT.jar,将其scp到baisheng1本地: 2.查看dbaservice ...

  10. Excel知识点与技巧1

    1.工作区:方便两个工作表之间进行对比 2.工作表标签颜色 3.交换两列的次序 4.快速到达边界:即快速到达第一行或最后一行 5.冻结窗格:可以固定某几行或某几列一直存在于窗口,不会随着往下拉或往右拉 ...