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] * M
        n = 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 + 1
        res = n + 1
        for i in range(n):
            t = ord(s[i]) - ord("a")
            res = min(res, d[t])
        return res


if __name__ == '__main__':
    print(Solution().process())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中提到了在使用Selenium时的等待条件之一,即判断页面元素是否存在。通过使用WebDriverWait类和ExpectedConditions类,可以等待页面上的某个元素出现,直到满足条件后再执行后续的操作。比如,使用presenceOfElementLocated方法判断某个元素是否存在于页面中。 引用中提到了另一个Selenium的等待条件,即元素加载出现然后再消失。通过使用visibilityOfElementLocated方法和invisibilityOfElementLocated方法,可以分别判断某个元素是否可见和消失。这样可以在需要等待元素加载完成后再执行后续操作,或者在元素消失后再执行其他操作。 除了使用Selenium提供的条件,还可以使用WebElement的is_displayed、is_enabled、is_selected方法来判断元素的显示状态、是否可用以及是否被选中。同时,还可以根据具体情况自己封装方法来判断元素是否符合某些条件。 总之,在使用Selenium时,可以根据需要选择使用Selenium提供的条件,或者根据元素的状态使用WebElement的方法来判断元素的显性状态。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Selenium显性等待的方式](https://blog.csdn.net/ycd500756/article/details/78557694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [selenium 显性等待 ajax加载完成后](https://blog.csdn.net/qq_35516360/article/details/122066361)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值