【华为OD机试 Python】滑动窗口问题(二)之求满足条件的最长子串

滑动窗口问题是机试的重点考查内容。合理移动左右指针来控制窗口大小是解决该类问题的核心。其中,最常见的问题是求最长连续子串。


题目描述

给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:
1、 只包含1个字母(a~z, A~Z) ,其余必须是数字;
2、 字母可以在子串中的任意位置;"
3、如果找不到满足要求的子串;如全是字母或全是数字;则返回-1


输入

字符串(只包含字母和数字)

输出

子串的长度

示例1

输入

abC124ACb

输出

4

说明

满足条件的最长子串是C124或者124A,长度都是4

示例2

输入

a5

输出

2

说明

满足条件的最长子串是a5,长度都是2

示例3

输入

1234

输出

-1

说明

未出现任何字母,不符合条件,输出-1

解题思路及代码

1.把子串中含有字母的个数作为连续的标准,只统计含有1个字母的子串的长度
2.遍历过程中手动存储字母,根据当前已有字母个数作出不同动作,分为1个字母,多个字母。
3.最长…问题,动态规划递推式:res = max (res, i - left + 1)

代码如下(示例):

s = input()
n = len(s)
left = 0
res = 0
cnt = 0  # 字母的个数
alpha_loc = []  # 存储字母的位置
for i in range(n):
    if s[i].isalpha():
        cnt += 1
        alpha_loc.append(i)
    if cnt == 1:
        res = max(res, i - left + 1)
    if cnt > 1:
        left = alpha_loc[-2] + 1  # 左指针需移至倒数第二个字母的下一个位置
        cnt -= 1
print(res if cnt > 0 and len(alpha_loc) < n else -1)  # 检查字符串是否满足条件

总结

以上就是本文要讲的内容,有心的小伙伴可以把这篇文章和上一篇关于滑动窗口的文章联系起来,发现一些共同之处。有任何想说的,我在这里等你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从那开始

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值