题目描述

小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。

输入描述:

一行一个字符串S。只包含小写字母。S的长度不超过106.

输出描述:

一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。
示例1

输入

复制

ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu

输出

复制

49
 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <string>
#include <deque>
#include <set>
#include <queue>
using namespace std;
#define ll long long
#define N 1000009
#define gep(i,a,b) for(int i=a;i<=b;i++)
#define gepp(i,a,b) for(int i=a;i>=b;i--)
#define gep1(i,a,b) for(ll i=a;i<=b;i++)
#define gepp1(i,a,b) for(ll i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof(a))
#define P pair<int,int>u+
char s[N];
int loc[];
int main()
{
scanf("%s",s);
int l=;
int len=strlen(s);
int ans=len+;
mem(loc,-);
int cnt=;
//只要[l,i]区间里含有26个字母即可
gep(i,,len-)
{
if(loc[s[i]-'a']==-)
{
cnt++;
}
loc[s[i]-'a']=i;//该字母最大的坐标
while(l<loc[s[l]-'a']) l++;//后面有了,那么前面的就可以不用了,l++。减小去区间长度
if(cnt==)
{
ans=min(ans,i-l+);
}
}
printf("%d\n",ans);
return ;
}

最新文章

  1. 腾讯优测优分享 | 探索react native首屏渲染最佳实践
  2. mysql创建/删除表的例子
  3. redis的备份和恢复
  4. python中 and 和 or 运算的核心思想 ——— 短路逻辑
  5. HDU 4939 Stupid Tower Defense
  6. 成都Uber优步司机快速注册攻略(外地车牌也可加入,不用现场培训)
  7. 结构的具体说明sublime text 2/3的Golang开发环境
  8. [kuangbin带你飞]专题六 最小生成树 POJ 2421 Constructing Roads
  9. java小技术之生成二维码
  10. AXI_DMA IP学习
  11. docker for mac 创建私有仓库
  12. SpringBoot 异常处理
  13. Mybatis中的like模糊查询四种方式
  14. sas 数据集导出到excel
  15. centos7 安装composer
  16. Java基础七-正则表达式
  17. win10 WiFi 密码查询 命令
  18. Android获取手机分辨率DisplayMetircs类
  19. LeetCode——Rotate Image
  20. (八)Linux之挂载命令

热门文章

  1. [洛谷P2186] 小Z的栈函数
  2. CSS入门使用
  3. 转 如何快速清理 chrom 缓存
  4. Unity里面两种单例模式的实现
  5. springmvc当要返回中文字符串时出现乱码
  6. Web Scalability for Startup Engineers Tip&amp;Techniques for Scaling You Web Application --读书笔记
  7. 后端 node 项目工具集
  8. 死磕 java并发包之AtomicStampedReference源码分析(ABA问题详解)
  9. PL/SQL 多表关联UPDATE
  10. 7.html超链接的使用