当前位置: 首页 > news >正文

记录--有惊无险

问题描述

解决了巨石迷阵,小 L L L长舒一口气。他坐在一棵繁茂的树下刚打开地图,突然,四周轰隆隆又一阵巨响,面前又出现了许多巨石。
情报有误!情报有误!!
根据搜集来的情报,这里不应该再次出现这么多巨石!
L L L赶忙起身,屏气凝神,重新专注起来…
有一个长度为 n n n的字符串,找到一个区间 [ l , r ] [l,r] [l,r],使得处于区间 [ l , r ] [l,r] [l,r]的石块上的字母,26个大写字母都至少出现一次。输出这个区间长度的最小值。
数据保证有解

输入格式

第-行一个整数 n , n < 2 × 1 0 5 n,n<2\times10^5 n,n<2×105
第二行,一个长度为 n n n的字符串

输出格式

一行,一个数,代表最短长度

样例输入

30
30
AABBCDEFGHIJKLMNOPQRSTUVWXYZZZ

样例输出

27

思路

做一个窗口滑动函数,保证窗口的距离在符合条件的同时最小。

完整代码

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

//做一个窗口滑动函数
int func(const string& s) {
    unordered_map<char, int> charCount;
    int tot = 26; 
    int l = 0, minlen = 999999999;
    int count = 0;
    //保持[l, r]区间中出现26个字母时,尽量保持最小距离(l增大)
    for (int r = 0; r < s.size(); r++) {
        if (charCount[s[r]] == 0) {
            count++;
        }
        charCount[s[r]]++;

        while (count == tot) {
            minlen = min(minlen, r - l + 1);
            charCount[s[l]]--;
            if (charCount[s[l]] == 0) {
                count--;
            }
            l++;
        }
    }

    return minlen;
}

int main() {
    int n = 0;
    cin >> n;
    string s;
    cin >> s;

    int ans = func(s);
    cout << ans << endl;

    return 0;
}

相关文章:

  • 产城融合典范:树莓科技如何助力宜宾数字经济腾飞​
  • 自启动、关联启动的拦截规则
  • 4g串口发短信踩坑
  • 【文件系统】
  • C语言for循环语句的用法(非常详细)
  • Ubuntu 源码安装 Qt5
  • 报错E0513:不能将 “const wchar_t *“ 类型的值分配到 “LPWSTR“ (aka “wchar_t *“) 类型的实体
  • 【性能测试入门_01性能测试jmeter基础实操场景详解】
  • # 如何确认elementary os (linux)使用的是Wayland而不是x11?
  • TCP连接过程图解
  • Android Compose是如何使用什么架构,多个Activity?还是Fragment?compose的ui又是如何卸载和挂载的呢?
  • 【day10】智慧导览:学习LBS定位精度标准
  • markdown转docx
  • Java基础关键_020_集合(四)
  • 电网电压暂态扰动机理与工业设备抗失压防护策略研究
  • 【SpringBoot】深入剖析 Spring Boot 自动装配原理(附源码与实战)
  • 内存检测工具——Qt Creator
  • git使用命令总结
  • python总结(3)
  • QT工程打开、编译、运行流程
  • 习近平同巴西总统卢拉共同会见记者
  • 多家中小银行存款利率迈入“1时代”
  • 言短意长|西湖大学首次“走出西湖”
  • 技术派|巴基斯坦导弹:让印度保持克制的“定海神针”?
  • 冷冰川谈黑白
  • 2025上海十大动漫IP评选活动启动