4077 k显性字符(枚举技巧)

2023-10-30 04:40
文章标签 技巧 字符 枚举 显性 4077

本文主要是介绍4077 k显性字符(枚举技巧),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 问题描述:

给定一个由小写字母构成的字符串 s。字符 c 被称为字符串 s 的 k 显性字符,当且仅当字符串 s 的所有长度不小于 k 的子串都包含字符 c。对于给定的字符串 s,请你找到一个最小的 k,使得 s 中至少存在一个 k 显性字符。

输入格式

一个由小写字母构成的字符串 s。

输出格式

一个整数,表示 k 的最小可能值。

数据范围

前 6 个测试点满足 1 ≤ |s| ≤ 10。
所有测试点满足 1 ≤ |s| ≤ 10 ^ 5。

输入样例1:

abacaba

输出样例1:

2

输入样例2:

zzzzz

输出样例2:

1

输入样例3:

abcde

输出样例3:

3
来源:https://www.acwing.com/problem/content/4080/

2. 思路分析:

分析题目可以知道数据规模为10 ^ 5,所以需要考虑如何枚举将时间复杂度控制在O(n)或者O(nlogn)之内,因为需要确定哪一个k显性字符可以使得k最小(k显性字符满足所有长度大于等于k的子串都包含当前的字符),所以我们可以枚举每一个出现的字符c,求解出字符c之间的最大间隔d,可以发现当间隔x小于d之后是不存在所有长度大于等于x之后的所有子串包含当前的字符c,所以对于当前枚举的字符间隔必须大于等于d,答案是否可以取到d呢?如果可以取到d说明对于当前枚举的字符最小的k等于d,我们可以使用反证法证明(很多题目都是类似的答案大于等于某个数,然后看是否可以取到这个数,如果可以取到那个答案就是当前的数字),假设对于当前枚举的字符c答案大于等于d + 1,说明所有字符c的间隔必须大于d之后才能够使得所有长度大于等于d + 1的子串都包含字符c,但是存在一个长度为d的子串使得包含当前的字符c,所以就矛盾了,那么答案可以取到d;因为对于当前枚举的字符c,答案大于等于d,而且可以取到d,所以答案就是d,我们可以枚举所有的字符c,求解字符c之间的最大间隔,在所有枚举的字符中取一个最小值就是答案,可以声明两个数组last和d,其中last[i]表示i对应的字符出现的上一次的位置,d[i]表示i对应的字符的最大间隔,对于第一次出现的字符那么上一次出现的位置就是0,并且还需要枚举最后一段的间隔,也即字符最后一次出现的位置到字符串末尾的位置之间的间隔更新一下最大值即可。

3. 代码如下:

class Solution:def process(self):s = input()M = 26# last记录对应字母出现的上一个位置, d记录对应字母之间的最大间隔last, d = [0] * M, [0] * Mn = len(s)# 注意下标从1开始, 方便计算长度for i in range(1, n + 1):t = ord(s[i - 1]) - ord("a")d[t] = max(d[t], i - last[t])last[t] = i# 计算最后一段的长度for i in range(1, n + 1):t = ord(s[i - 1]) - ord("a")# 注意是减去上一段的长度d[t] = max(d[t], n - last[t])# 因为需要求解最小值将结果置为n + 1res = n + 1for i in range(n):t = ord(s[i]) - ord("a")res = min(res, d[t])return resif __name__ == '__main__':print(Solution().process())

这篇关于4077 k显性字符(枚举技巧)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/305649

相关文章

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

Spring @RequestMapping 注解及使用技巧详解

《Spring@RequestMapping注解及使用技巧详解》@RequestMapping是SpringMVC中定义请求映射规则的核心注解,用于将HTTP请求映射到Controller处理方法... 目录一、核心作用二、关键参数说明三、快捷组合注解四、动态路径参数(@PathVariable)五、匹配请

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、