华为OD机试 - 寻找符合要求的最长子串(Java JS Python)
找最长子串,避开那个烦人的特定字符,还得确保每个字符最多出现两次。想象一下,就像在玩一个捉迷藏游戏,你得小心地绕开那个特定的“幽灵”字符,同时还得确保队伍里没有哪个小朋友超过两次出现。滑动窗口是解决这类问题的万能钥匙,但得同时兼顾这两个条件哦!
首先,得准备好两个指针,start和end。想象start是队头,end是队尾。咱们要做的就是一步一步地扩大队伍,看看能不能满足条件。但如果遇到了那个烦人的特定字符,那就得立刻让整个队伍解散,重新开始。因为队伍里不能有它啊!
同时,得用一个计数器,记录每个字符出现的次数。比如,用字典来存,这样查起来方便。每走一步,就更新一下计数器。如果发现某个字符超过两次,就得让start向前移动,慢慢缩小区队,直到所有字符的出现次数都不超过两次为止。
举个简单的例子,假设要排除的字符是D,字符串是ABC123。这就像一个理想的世界,没有任何D,而且每个字符都只出现一次。那么整个字符串就是我们想要的最长子串啦!
再想象一个复杂点的例子,比如排除字符是A,字符串是AABC。当我们走到第二个A的时候,这个队伍里出现了排除字符A,所以得把整个队伍重置到A后面的B,从零开始计数。这样,我们的最大子串长度只能是后面的部分啦!
这个方法看起来是不是很高效呢?是的,因为我们每个字符都只会被访问两次,一次是start,一次是end。这样时间复杂度是O(n),相当节省时间!
现在你是不是已经明白了呢?记住,处理这类问题的关键是平衡好排除条件和字符出现次数,同时还得灵活调整窗口的大小。就像在跳舞一样,得跟着节奏,适时进退哦!
题目描述
给定一个字符串s,找出这样一个子串:
- 该子串中任意一个字符最多出现2次
- 该子串不包含指定某个字符
请你找出满足该条件的最长子串的长度
输入描述
第一行为:要求不包含的指定字符,为单个字符,取值范围[0-9a-zA-Z]
第二行为:字符串s,每个字符范围[0-9a-zA-Z],长度范围[1, 10000]
输出描述
一个整数,满足条件的最长子串的长度;
如果不存在满足条件的子串,则返回0
用例
输入 | D ABC123 |
输出 | 6 |
说明 | 无 |
输入 |