找出字符串的最长子集的长度
题目:输入一个字符串,找出一个最长的子集,该子集需包含一个字母(字母位置随机,前后中间均可),其余均为数字,返回这个子集的长度。若该字符全为数字或全为字母,则返回-1。
如:输入:fhh3256hse,输出:5;输入:a5,输出:2;输入:hsh,输出:-1
判断字符串的组成
- 判断是否全为数字
- isdigit()方法
s = '123456'
print(s.isdigit()) #全为数字则返回True,否则返回False
#True
- 使用int()方法转换字符串
s = '123456'
try:
int(s)
print(True)
except:
print(False)
#True
- 判断是否全为字母
- isalpha()方法
s = 'abc'
print(s.isalpha()) #全为字母则返回True,否则返回False
#True
- 判断其中是否存在数字
s = 'abc'
for i in range(10):
if str(i) in s:
print(False)
break
else:
pass
if i == 9:
print(True) #运行到最后仍未被打断,表明其中没有数字存在
#True
- 判断是否有字母或数字组成
- 使用isalnum()方法
如果字符串中含有除了字母或数字外的字符,如空格,则返回False
s1 = 'gva86'
s2 = 'fds 46'
print(s1.isalnum()) #True
print(s2.isalnum()) #False
思路

- 找出每段数字的长度,最后的长度需加1。(附带相邻的一个字母)
- 找出是否有相邻的数字段间只隔一个字母,返回其长度。注意,每段数字可能与其前后的数字段都只相隔一个字母,此时,该数字段要重复使用,如图片中的数字段2。
- 将1的长度与2的长度的合集中找出最大的
#判断代码
#以下代码中的s代表输入的字符串,W()方法用于判断字符是否为数字
s = '76ghf68a583g7458fed46346dfg'
l = [] #顺序存放每段有几个连续数字
l_1 = [] #临时存放每段数字的始终位置
l_2 = [] #存放每个l_1,即存放所有段数字的始终位置
n = 0 #每段数字的长度
for i in range(len(s)):
if W(s[i]): #为数字时
n += 1
if len(l_1) == 0: #为每段数字的第一个数字时
l_1.append(i) #每段数字的第一个数字的位置
else:
if n == 0: #前面的不为数字
pass
else: #遇到每段数字终结后的第一个字母
l.append(n)
n = 0
l_1.append((i-1)) #每段数字的最后一个数字的位置
l_2.append(l_1)
l_1 = [] #还原为空
if i == len(s)-1 and W(s[i]): #字符串最后一个为数字时
l.append(n)
l_1.append((i))
l_2.append(l_1)
if len(l) >= 2: #最少包含两段数字时
numbers = [] #统计符合的子集的长度
for i in range(len(l_2)-1):
if l_2[i+1][0] - l_2[i][1] == 2: #相邻段数字间只隔一个字母时
number = l[i] + l[i+1] +1 #如:123a4567,则number=8
numbers.append(number)
else:
pass
for i in l:
numbers.append(i+1) #将原先每段数字的长度+1放入其中,子集需包含一个字母,故需+1
else:
numbers = [i+1 for i in l]
#最后取出numbers中最大的一个数就是最长的子集的长度
代码
#!-*-coding:utf-8 -*-
# python3.7
# @Author:fuq666@qq.com
# Update time:2021.03.19
# Filename:找出字符串的最长子集的长度
def W(s):
"""
判断是否为数字
:param s: 一个字符
:return: True or False
"""
try:
int(s)
return True
except:
return False
def Find(s):
l = [] #顺序存放每段有几个连续数字
l_1 = [] #临时存放每段数字的始终位置
l_2 = [] #存放每个l_1,即存放所有段数字的始终位置
n = 0 #每段数字的长度
for i in range(len(s)):
if W(s[i]): #为数字时
n += 1
if len(l_1) == 0: #为每段数字的第一个数字
l_1.append(i) #每段数字的第一个数字的位置
else:
if n == 0: #前面的不为数字
pass
else: #每段数字终结后的第一个字母
l.append(n)
n = 0
l_1.append((i-1)) #每段数字的最后一个数字的位置
l_2.append(l_1)
l_1 = [] #还原为空
if i == len(s)-1 and W(s[i]): #字符串最后一个为数字时
l.append(n)
l_1.append((i))
l_2.append(l_1)
if len(l) >= 2: #最少包含两段数字时
numbers = []
for i in range(len(l_2)-1):
if l_2[i+1][0] - l_2[i][1] == 2: #相邻段数字间只隔一个字母时
number = l[i] + l[i+1] +1 #如:123a4567,则number=8
numbers.append(number)
else:
pass
for i in l:
numbers.append(i+1) #将原先每段数字的长度+1放入其中
else:
numbers = [i+1 for i in l]
# print(numbers)
numbers.sort()
print(numbers[-1])
if __name__ == '__main__':
# s = '76ghf68a583g7458fed46346dfg'
# s = 'asd21424fa'
# s = 'a5'
s = input('请输入字符串:')
if s.isdigit() or s.isalpha():
print(-1)
else:
Find(s)
思考
使用正则表达式,找出符合的子集。同一个数字段需被前后相隔一个字母的数字段多次使用的情况?
遇上方知有

浙公网安备 33010602011771号