找出字符串的最长子集的长度

题目:输入一个字符串,找出一个最长的子集,该子集需包含一个字母(字母位置随机,前后中间均可),其余均为数字,返回这个子集的长度。若该字符全为数字或全为字母,则返回-1。

如:输入:fhh3256hse,输出:5;输入:a5,输出:2;输入:hsh,输出:-1

判断字符串的组成

  • 判断是否全为数字
  1. isdigit()方法
s = '123456'
print(s.isdigit())		#全为数字则返回True,否则返回False
#True
  1. 使用int()方法转换字符串
s = '123456'
try:
    int(s)
    print(True)
except:
    print(False)
#True
  • 判断是否全为字母
  1. isalpha()方法
s = 'abc'
print(s.isalpha())		#全为字母则返回True,否则返回False
#True
  1. 判断其中是否存在数字
s = 'abc'
for i in range(10):
    if str(i) in s:
        print(False)
        break
    else:
        pass
    if i == 9:
        print(True)		#运行到最后仍未被打断,表明其中没有数字存在
#True
  • 判断是否有字母或数字组成
  1. 使用isalnum()方法

如果字符串中含有除了字母或数字外的字符,如空格,则返回False

s1 = 'gva86'
s2 = 'fds 46'
print(s1.isalnum())		#True
print(s2.isalnum())		#False

思路

  1. 找出每段数字的长度,最后的长度需加1。(附带相邻的一个字母)
  2. 找出是否有相邻的数字段间只隔一个字母,返回其长度。注意,每段数字可能与其前后的数字段都只相隔一个字母,此时,该数字段要重复使用,如图片中的数字段2。
  3. 将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)

思考

使用正则表达式,找出符合的子集。同一个数字段需被前后相隔一个字母的数字段多次使用的情况?

posted @ 2021-03-25 21:45  F___Q  阅读(96)  评论(0)    收藏  举报