找到具有连续字符的最长子字符串,其中字符串可能混乱

时间:2013-03-25 13:04:38

标签: python string algorithm

给定一个字符串,找到其字符连续的最长子字符串(即它们是连续的字母),但可能是混乱的(即乱序)。例如:
输入:"owadcbjkl"
输出:"adcb"
我们认为adcbabcd形成一样是连续的。

(这是一个面试问题。)

我知道运行一个带有2个条件的while循环,一个用Python ord检查连续字符,另一个条件用于查找最小值和最大值,并检查以下所有字符是否都在此范围内。

有没有办法解决这个问题,运行时间复杂度低?我能做到的最好的是O(N ^ 2),其中N是输入字符串的长度,而ord()似乎是一个缓慢的操作。

1 个答案:

答案 0 :(得分:4)

如果子字符串定义为''.join(sorted(substr)) in alphabet,则:

  • 子字符串中没有重复项,因此大小不一样 最长的子串小于(或等于)字母的大小

  • (ord(max(substr)) - ord(min(substr)) + 1) == len(substr),其中 ord()返回字母表中的位置(+/-常数)(内置 ord()可用于小写ascii字母)

以下为O(n*m*m) - 时间,O(m) - 空间解决方案,其中nlen(input_string)mlen(alphabet)

from itertools import count

def longest_substr(input_string):
    maxsubstr = input_string[0:0] # empty slice (to accept subclasses of str)
    for start in range(len(input_string)): # O(n)
        for end in count(start + len(maxsubstr) + 1): # O(m)
            substr = input_string[start:end] # O(m)
            if len(set(substr)) != (end - start): # found duplicates or EOS
                break
            if (ord(max(substr)) - ord(min(substr)) + 1) == len(substr):
                maxsubstr = substr
    return maxsubstr

示例:

print(longest_substr("owadcbjkl"))
# -> adcb