当前位置:网站首页>*3-3牛客网 重新排列
*3-3牛客网 重新排列
2022-08-09 13:31:00 【叶萧白】
题目描述

样例

源代码
#include<iostream>
using namespace std;
string s = "puleyaknoi";
const int maxn = 1e5 + 10;
const int inf = 0x3f3f3f3f;
int a[maxn], b[maxn];
char c[maxn];
int solve() //判断函数,判断元素的个数是否满足题目要求
{
for (int i = 0; i < 26; ++i)
if (a[i] < b[i])
return false;
return true;
}
int main()
{
int t;
scanf("%d", &t);
for (int i = 0; i < s.size(); ++i)
b[s[i] - 'a']++; //记录目标子串每个元素的个数
getchar(); //获取回车,防止干扰后序字符串的输入
for (int i = 1; i <= t; ++i)
{
scanf("%s", c);
int lc = strlen(c);
int r = 0, ans = inf;
for (int l = 0; l < lc; ++l)
{
while (!solve() && r < lc) //寻找目标子串,r一直右移直到当前区间[l,r]内出现目标子串
a[c[r++] - 'a']++;
if (solve()) //一旦出现目标子串就记录一下此时的最小区间
ans = min(ans, r - l);
a[c[l] - 'a']--; //l不断的右移,每次都除去一个最左边的元素,目标就是找到最小区间
}
if (ans == inf) //没有找到
puts("-1");
else
printf("%d\n", ans);
}
return 0;
}
关于这题
刚刚开始看到这个题目的时候,感觉很不好做,唯一想到的方法就是暴力,但是很显然暴力一定会超时,一看题解发现是个尺取法的经典例题,无奈这种题目做的比较少,看懂代码也花了一定的时间,也参考了博客理解尺取法的概念与用法。具体题目分析见代码
题解的关键就是 solve 这个判断函数
边栏推荐
- 分布式系统关注点(8)——99%的人都能看懂的「熔断」以及最佳实践 (转载非原创)
- Jetpack Compose——Image使用Coli加载网络图片(包含GIF、SVG)
- Talking about CQRS Mode
- 【面试高频题】可逐步优化的链表高频题
- Xshell建立SSH隧道连接
- 如何用vs新建Asp.net项目(Web页面)
- Jetpack Compose - simply the basic attributes of Modifier is introduced
- Code of Conduct for Firefighters
- typeorm 批量插入数据优化和插入冲突操作
- flink并行度知识点
猜你喜欢
随机推荐
如何用vs新建Asp.net项目(Web页面)
理解redis,一篇就够
除了开心麻花,中国喜剧还有什么?
响应式pbootcms模板家禽饲养类网站
12. cuBLAS Development Guide Chinese version--Level-1 functions asum() and axpy() in cuBLAS
响应式pbootcms模板外贸灯具类网站
C语言 三子棋(含完整 代码详解)
Es7.x使用RestHighLevelClient进行查询操作
从荷兰国旗问题到快排优化升级
11.cuBLAS开发指南中文版--cuBLAS中的Level-1函数amax()和amin()
响应式pbootcms模板仪表水表类网站
二叉树的遍历(py)
浅谈CQRS模式
阿里巴巴云原生大数据运维平台 SREWorks 正式开源
几种常见路由类型及其优先级
探索快八年,谁挡住了小红书的电商梦?
12.cuBLAS开发指南中文版--cuBLAS中的Level-1函数asum()和axpy()
Sql之各种Join
Dry+Bean+Dataset R language data analysis, report in English
对百度的内容进行修改









