使用Python打印字母的最长子序列

2024-04-19 17:35:28 发布

您现在位置:Python中文网/ 问答频道 /正文

写一段代码来打印输入字符串中最长的字母子序列。 -首先,要求用户输入任何字符串。 -您的代码应该打印输入字符串中最长的子字符串,它只包含英文字母表中的字母,包括大小写字母。你知道吗

如果有多个子序列具有相同的最长长度,则代码返回第一个子序列。
如果input\u str不包含任何字母,则函数返回空字符串。

例如

  • 对于输入字符串“ab24[AaBbCDExy0longest]”,它应该打印“AaBbCDExy”。

  • 对于输入字符串'a a1234b | c | d',它应该打印'a'。

  • 对于输入字符串“12345”,应打印“”(空字符串)。

尝试了以下代码,但没有成功:

# Your code here

#longest_letterSeq = '' 
def longestSubstring(s): 
    longest_letterSeq = '' 
    i = 0
    while(i<len(s)): 

        curr_letterSeq = '' 

        # For letter substring  
        while(i<len(s) and s[i].isalpha()): 
            curr_letterSeq += s[i] 
            i+= 1

        # Case handling if the character is not letter     
            if(i< len(s) and not(s[i].isalpha())) : 
                i+= 1

            if(len(curr_letterSeq) > len(longest_letterSeq) ): 
                longest_letterSeq = curr_letterSeq 

    return longest_letterSeq

str = input("Please input your string here: ")

print(longestSubstring(str))

有人能帮助编辑或更正代码吗?你知道吗


Tags: 字符串代码inputlenlongestifhere字母
3条回答

一个选项是将re.findallmax一起使用:

import re
max(re.findall('[a-zA-Z]+',  'ab24[AaBbCDExy0longest]'), key=len)
# 'AaBbCDExy'

max(re.findall('[a-zA-Z]+', 'a a a1234b|c|d '), key=len)
# 'a'

考虑没有匹配的情况的小技巧:

max(re.findall('[a-zA-Z]+', '12345 ') or [''], key=len)
# ''

尽管我建议你采用更具可读性的方法:

r = re.findall('[a-zA-Z]+', '12345 ') 
if r:
    out = max(r, key=len)
else:
    out = ''

或者正如@deepstop对条件表达式的建议:

out = max(r, key=len) if r else ''

另一种方法是用空格替换所有非字母,拆分,然后选择最长的字符串。你知道吗

import re

def func(s) :
    l = re.sub('[^a-zA-Z]+', ' ', s).split()
    l.append('')  # Append an empty string so the list is bound not to be empty.
    return max(l, key=len)

func('ab24[AaBbCDExy0longest]')
func('foo2bar')
func('')

和yatu一样,我对这个问题的第一个想法是regex。然而,我提供了一个解决方案的基础上,你的方法。代码中的问题是,只有当字符是alpha时才增加i。因此对于字符串abc123,您将增加i 3倍。但是由于下一个字符不是alpha,所以你不需要增加i,这意味着i现在被固定在一个值3上,它小于字符串6的长度。所以你的函数陷入了一个无限循环,因为你停止增加i

代码的简化版本可以编写如下。基本上不需要第二个while循环。实际上根本不需要while循环,您可以使用for循环来迭代字符串中的每个字符

def longestSubstring(string):
    longest_letterSeq = ''
    curr_letterSeq = ''
    for char in string:
        if char.isalpha():
            curr_letterSeq += char
        else:
            if len(curr_letterSeq) > len(longest_letterSeq):
                longest_letterSeq = curr_letterSeq
            curr_letterSeq = ''
    return longest_letterSeq

my_strings = ['ab24[AaBbCDExy0longest]', 'a a a1234b|c|d ', '12345']
for string in my_strings:
    longest = longestSubstring(string)
    print(f'the longest string in "{string}" is "{longest}"')

输出

the longest string in "ab24[AaBbCDExy0longest]" is "AaBbCDExy"
the longest string in "a a a1234b|c|d " is "a"
the longest string in "12345" is ""

相关问题 更多 >