【问题标题】:Finding the longest alphabetical substring in a longer string在较长的字符串中查找最长的字母子字符串
【发布时间】:2016-09-13 21:18:06
【问题描述】:

此代码查找字符串中最长的字母子字符串 (s)。

letter = s[0]      
best = ''          
for n in range(1, len(s)):    
    if len(letter) > len(best):
        best = letter
    if s[n] >= s[n-1]:
        letter += s[n]    
    else:                      
        letter = s[n]

它大部分时间都有效,但偶尔会给出错误的答案,我很困惑为什么它有时只有效。例如,当:

s='maezsibmhzxhpprvx'

它说答案是“hpprv”,而应该是“hpprvx”。

另外一种情况,当

s='ysdxvkctcpxidnvaepz'

它给出的答案是“cpx”,而它应该是“aepz”。

谁能理解为什么会这样?

【问题讨论】:

  • 您的代码运行良好并具有预期的输出。
  • 它可以运行,但@EllaP 明确表示它有时并没有达到预期的效果。
  • 如果您看到以下带有修复的答案,显然它并不总是具有预期的输出。

标签: python string alphabetical


【解决方案1】:

你应该移动这张支票

if len(letter) > len(best):
    best = letter

在循环的其余部分之后

【讨论】:

    【解决方案2】:

    您的例程几乎没问题,以下是您的例程、已修复的例程和解决您的问题的另一种可能的解决方案之间的一个小比较:

    def buggy(s):
        letter = s[0]
        best = ''
        for n in range(1, len(s)):
            if len(letter) > len(best):
                best = letter
            if s[n] >= s[n - 1]:
                letter += s[n]
            else:
                letter = s[n]
    
        return best
    
    
    def fixed(s):
        letter = s[0]
        best = ''
        for n in range(1, len(s)):
            if s[n] >= s[n - 1]:
                letter += s[n]
            else:
                letter = s[n]
    
            if len(letter) > len(best):
                best = letter
    
        return best
    
    
    def alternative(s):
        result = ['' for i in range(len(s))]
        index = 0
    
        for i in range(len(s)):
            if (i == len(s) - 1 and s[i] >= s[i - 1]) or s[i] <= s[i + 1]:
                result[index] += s[i]
            else:
                result[index] += s[i]
                index += 1
    
        return max(result, key=len)
    
    
    for sample in ['maezsibmhzxhpprvx', 'ysdxvkctcpxidnvaepz']:
        o1, o2, o3 = buggy(sample), fixed(sample), alternative(sample)
        print "buggy={0:10} fixed={1:10} alternative={2:10}".format(o1, o2, o3)
    

    正如您在您的版本中看到的,内部循环条件的顺序不好,您应该将第一个条件移动到循环的末尾。

    【讨论】:

      【解决方案3】:

      逻辑几乎没问题,除非letter 在最后一次循环迭代中增长(当n == len(s) - 1 时),best 上次没有改变。您可以在循环后插入另一个 best = letter 部分,或者重新仔细考虑程序结构,以免重复。

      【讨论】:

      • 此外,您可能需要考虑有多个最长的字母子字符串的情况...您只想选择遇到的第一个吗?这实际上取决于您对此的应用,但值得考虑您希望如何处理这种情况。
      • 绝对。最重要的是,我重新阅读了这个问题,我只是认为程序实际上并不关心子字符串的字母顺序。
      猜你喜欢
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多