Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python打印字母的最长子序列_Python_String_Python 3.7_Subsequence - Fatal编程技术网

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

使用Python打印字母的最长子序列,python,string,python-3.7,subsequence,Python,String,Python 3.7,Subsequence,编写一段代码以打印输入字符串中最长的字母子序列。 -首先,要求用户输入任何字符串。 -代码应该打印输入字符串的最长子字符串,该字符串只包含英文字母表中的字母,包括大写和小写字母 如果存在相同最长长度的多个子序列,则代码将返回第一个子序列。 如果输入不包含任何字母,函数将返回空字符串。 比如说, 对于输入字符串“ab24[AaBbCDExy0longest]”,它应该打印“AaBbCDExy” 对于输入字符串“a a1234b | c | d”,它应该打印“a” 对于输入字符串“12345”,它

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

如果存在相同最长长度的多个子序列,则代码将返回第一个子序列。
如果输入不包含任何字母,函数将返回空字符串。

比如说,

  • 对于输入字符串“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))
#您的代码在这里
#最长字母顺序=“”
def longestSubstring(s):
最长字母顺序=“”
i=0

而(i一个选项是使用
re.findall
max

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 ''

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

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 ''

像yatu一样,我对这样一个问题的第一个想法是正则表达式。然而,我根据您的方法提供了一个解决方案。您代码中的问题是,当字符是alpha时,您只增加I。因此对于字符串
abc123
您将增加I 3倍。但由于下一个字符不是alpha,您不会增加I。这意味着I是now的值为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 ""

像yatu一样,我对这样一个问题的第一个想法是正则表达式。然而,我根据您的方法提供了一个解决方案。您代码中的问题是,当字符是alpha时,您只增加I。因此对于字符串
abc123
您将增加I 3倍。但由于下一个字符不是alpha,您不会增加I。这意味着I是now的值为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 ""

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

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('')

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

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('')

最后一个例子的第三行应该是
key=len
,或者如果r为“”,则应该是
out=max(r,key=len)
Yes@Deepstop。Yes只是想为OP增加一个可读性。无论如何,谢谢,让我们把它添加到tunp中。我也这么想。应该是
key=len
在最后一个例子的第三行,或者是
out=max(r,key=len)如果r else“”
是的,谢谢@Deepstop。是的,我只是想为OP找一个更可读的版本。无论如何,谢谢,让我们把它添加到tunp中。我也这么想。