滑动窗口问题是机试的重点考查内容。合理移动左右指针来控制窗口大小是解决该类问题的核心。其中,最常见的问题是求最长连续子串。
题目描述
给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:
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) # 检查字符串是否满足条件
总结
以上就是本文要讲的内容,有心的小伙伴可以把这篇文章和上一篇关于滑动窗口的文章联系起来,发现一些共同之处。有任何想说的,我在这里等你。