【问题标题】:How do I find the highest amount of overlapping substrings in a line in python?如何在 python 中的一行中找到最多的重叠子字符串?
【发布时间】:2019-12-03 23:37:01
【问题描述】:

我有以下字符串

a = "AAWJBDJSDJBJSQQAAASDNDKSDKJSDKSJDDJKJSKJAAAAASKJDSJDKJSDKJDAAAAAAAA" 我要做的第一件事是数一数 A 的行数:

a.count("A")这工作正常。

接下来我要做的是找到最长重叠“A”的值。在这种情况下,它将是 AAAAAAAA(8 次)。 所以我希望我的输出是: The Longest polyA is 8

有人知道我该怎么做吗?

【问题讨论】:

  • 您是否希望/期望重复的子字符串以 A 开头,或者这只是一个示例,JB 可能是另一个示例?
  • 不,在这种情况下,我只搜索多个重叠的 A
  • A+ 的正则表达式匹配必须在字符串中尽可能早地开始作为最长匹配。因此,对“重叠”(和不重叠)的引用是多余的。您只需要字符串中最长的 As 序列。

标签: python string substring


【解决方案1】:

遍历字符串,跟踪最长的运行:

a = "AAWJBDJSDJBJSQQAAASDNDKSDKJSDKSJDDJKJSKJAAAAASKJDSJDKJSDKJDAAAAAAAA"
longest = 0
cnt = 0
for c in a:
    if c == 'A':
        cnt += 1
    else:
        longest = max(longest, cnt)
        cnt = 0

longest = max(longest, cnt)
print(longest)    

【讨论】:

    【解决方案2】:

    最好的方法是使用正则表达式:

    import re
    
    string = "AAWJBDJSDJBJSQQAAASDNDKSDKJSDKSJDDJKJSKJAAAAASKJDSJDKJSDKJDAAAAAAAA"
    
    print(len(max(re.findall('A+', string),key=len)))
    

    【讨论】:

      【解决方案3】:

      我可以想到两种方法。

      第一种方法使用正则表达式,易于编写。这对你的情况来说已经足够了。

      import re
      
      string = "AAWJBDJSDJBJSQQAAASDNDKSDKJSDKSJDDJKJSKJAAAAASKJDSJDKJSDKJDAAAAAAAA"
      
      print(len(max(re.findall('A+', string)))) # abusing the fact that longer strings are "larger"
      

      第二种方法使用模式匹配,比较复杂。查看this library 获取灵感。

      【讨论】:

        【解决方案4】:

        您正在寻找具有重复单个字符的最长子字符串 - 不重叠。

        以下函数将找到最长的子字符串,其中包含一个重复的单个字符,无论该字符是否为“A”。

        def find_longest_substring(s):
            longest_substring = s[0]
            longest_length = 1
            substring = s[0]
            for e in s:
                if e == substring[0]:
                    substring += e
                    continue
                length = len(substring)
                if length > longest_length:
                    longest_substring = substring
                    longest_length = length
            return longest_substring
        
        
        input_string = "AAWJBDJSDJBJSQQAAASDNDKSDKJSDKSJDDJKJSKJAAAAASKJDSJDKJSDKJDAAAAAAAA"
        print(f"The longest PolyA is {find_longest_substring(input_string)}")
        

        【讨论】:

          【解决方案5】:

          您可以在这里使用itertools.groupby()max()

          >>> from itertools import groupby
          >>> a = "AAWJBDJSDJBJSQQAAASDNDKSDKJSDKSJDDJKJSKJAAAAASKJDSJDKJSDKJDAAAAAAAA"
          >>> max(("".join(g) for _, g in groupby(a)), key=len)
          AAAAAAAA
          

          【讨论】:

            猜你喜欢
            • 2021-04-22
            • 1970-01-01
            • 1970-01-01
            • 2017-05-30
            • 1970-01-01
            • 1970-01-01
            • 2015-11-23
            • 1970-01-01
            • 2014-11-01
            相关资源
            最近更新 更多