这是我在 Python 中的解决方案。它返回假设 0 索引序列的索引。因此,对于给定的示例,它返回(9, 11)
而不是(10, 12)
. 显然,(10, 12)
如果您愿意,可以很容易地对其进行变异以返回。
def solution(s, ss):
S, E = [], []
for i in xrange(len(s)):
if s[i] == ss[0]:
S.append(i)
if s[i] == ss[-1]:
E.append(i)
candidates = sorted([(start, end) for start in S for end in E
if start <= end and end - start >= len(ss) - 1],
lambda x,y: (x[1] - x[0]) - (y[1] - y[0]))
for cand in candidates:
i, j = cand[0], 0
while i <= cand[-1]:
if s[i] == ss[j]:
j += 1
i += 1
if j == len(ss):
return cand
用法:
>>> from so import solution
>>> s = 'ADCBDABCDACD'
>>> solution(s, 'ACD')
(9, 11)
>>> solution(s, 'ADC')
(0, 2)
>>> solution(s, 'DCCD')
(1, 8)
>>> solution(s, s)
(0, 11)
>>> s = 'ABC'
>>> solution(s, 'B')
(1, 1)
>>> print solution(s, 'gibberish')
None
我认为时间复杂度是 O(p log(p)) 其中 p 是序列中引用的索引对的数量,search_sequence[0]
并且search_sequence[-1]
索引search_sequence[0]
小于索引,search_sequence[-1]
因为它使用 O( n log n) 算法。但话又说回来,我最后的子字符串迭代可能完全掩盖了排序步骤。我不太确定。
它可能具有最坏情况的时间复杂度,以 O(n*m) 为界,其中 n 是序列的长度,m 是搜索序列的长度,但目前我想不出一个最坏情况的例子.