【问题标题】:Printing longest subsequence of letters using Python使用 Python 打印最长的字母子序列
【发布时间】:2019-10-02 10:03:46
【问题描述】:

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

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

例如,

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

  • 对于输入字符串'a 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))

有人可以帮助编辑或正确的代码吗?

【问题讨论】:

    标签: python string python-3.7 subsequence


    【解决方案1】:

    一种选择是使用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 ''
    

    【讨论】:

    • 应该是最后一个例子第三行的key=len,或者只是out = max(r, key=len) if r else ''
    • 是的,谢谢@Deepstop。是的,只是想为 OP 寻找一个更具可读性的版本。无论如何,谢谢,让我们也添加一下
    • NP。我也是这么想的。
    【解决方案2】:

    像 yatu 一样,我对此类问题的第一个想法是正则表达式。但是,我根据您的方法提供了一个解决方案。您的代码中的问题是您仅在字符为 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 ""
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-29
        • 2015-06-14
        • 1970-01-01
        相关资源
        最近更新 更多