给定一个字符串,找到其字符连续的最长子字符串(即它们是连续的字母),但可能是混乱的(即乱序)。例如:
输入:"owadcbjkl"
输出:"adcb"
我们认为adcb
与abcd
形成一样是连续的。
(这是一个面试问题。)
我知道运行一个带有2个条件的while循环,一个用Python ord
检查连续字符,另一个条件用于查找最小值和最大值,并检查以下所有字符是否都在此范围内。
有没有办法解决这个问题,运行时间复杂度低?我能做到的最好的是O(N ^ 2),其中N是输入字符串的长度,而ord()
似乎是一个缓慢的操作。
答案 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)
- 空间解决方案,其中n
为len(input_string)
且m
为len(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