这个题是我从开局做到结尾都没做出来的题。。。。。
先上题目
链接:https://ac.nowcoder.com/acm/contest/3002/G
题目描述
eli拿到了一个仅由小写字母组成的字符串。 她想截取一段连续子串,这个子串包含至少 个相同的某个字母。 她想知道,子串的长度最小值是多少? 注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串“arcaea”\mathit{“arcaea”}“arcaea”而言,“arc”\mathit{“arc”}“arc”、“rcae”\mathit“rcae”“rcae”都是其子串。而“car”\mathit“car”“car”、“aa”\mathit“aa”“aa”则不是它的子串。
输入描述:
第一行输入两个正整数 和 输入仅有一行,为一个长度为 的、仅由小写字母组成的字符串。
输出描述:
如果无论怎么取都无法满足条件,输出 。否则输出一个正整数,为满足条件的子串长度最小值。
示例1
输入
5 2
abeba
输出
3
说明
选择“beb”\mathit“beb”“beb”子串,长度为3,其中包含相同的两个'b'
首先贴第一串代码 这个参考jxy大佬的代码
#include<iostream> #include<string> #include<map> using namespace std; int main(void) { int n,k; string std; map<char,int> mp; int ans=-1,l=0,cnt=0; while(cin>>n>>k>>std) { for(int i=0;i<n;i++) { char c=std[i]; mp[c]++; while(mp[c]==k) { if(ans==-1) ans=i-l+1; else ans=min(i-l+1,ans); mp[std[l]]--; l++; } } cout<<ans<<endl; } return 0; }
关于map才看了一点点 只会一点基本的操作
稍微写下这个代码的思路 用map来计数 记录每一个字母的个数 当有一个字母先达到k个时 就记录这个的长度 一开始l在0 所以要往右边缩 把左侧缩到达到k个的字母这 不用担心会有问题 因为被缩去的字母若是和后面的达到了k也必然更长 这里的代码几乎和jxy大佬的代码一致 我是在看懂大佬的代码之后再自己写了一遍
还多少看了一点其他大佬的代码真的是牛皮。。。