PS: Это не дубликат How to find the overlap between 2 sequences, and return itНайти Num перекрывающихся и не перекрывающихся подстроки в струнной
[Хотя я прошу решений в выше подхода, если он может быть применен к следующей задаче]
Q: Несмотря на то, что я правильно понял, он по-прежнему не является масштабируемым решением и определенно не оптимизирован (низкий балл). Прочтите следующее описание проблемы и предложите лучшее решение.
Вопрос:
Для простоты, мы требуем префиксы и суффиксы, чтобы быть непустым и короче всей строки S. Граница строки S
является любая строка, которая является как префикс и суффикс. Например, "cut"
является границей строки "cutletcut"
, а строка "barbararhubarb"
имеет две границы: "b"
и "barb"
.
class Solution { public int solution(String S); }
, что, учитывая строку S
, состоящая из N
символов, возвращает длину самой длинной границы, которая имеет по крайней мере три неперекрывающихся вхождений в данной строке. Если нет такой границы в S
, функция должна возвращать 0.
Например,
- если
S = "barbararhubarb"
функция должна возвращать1
, как описано выше; - , если
S = "ababab"
функция должна возвращать2
, так как"ab"
и"abab"
оба границыS
, но только"ab"
имеет три неперекрывающихся вхождений; - если
S = "baaab"
функция должна вернуть0
, так как ее единственная граница"b"
происходит только дважды.
Предположим, что:
N
представляет собой целое число в диапазоне[0..1,000,000]
;- строка
S
состоит только из прописных букв (a−z
).
Сложность:
- ожидается в худшем случае сложность
O(N)
; - ожидаемая наихудшая сложность пространства -
O(N)
(не считая хранения, необходимого для входных аргументов).
def solution(S):
S = S.lower()
presuf = []
f = l = str()
rank = []
wordlen = len(S)
for i, j in enumerate(S):
y = -i-1
f += S[i]
l = S[y] + l
if f==l and f != S:
#print f,l
new=S[i+1:-i-1]
mindex = new.find(f)
if mindex != -1:
mid = f #new[mindex]
#print mid
else:
mid = None
presuf.append((f,mid,l,(i,y)))
#print presuf
for i,j,k,o in presuf:
if o[0]<wordlen+o[-1]: #non overlapping
if i==j:
rank.append(len(i))
else:
rank.append(0)
if len(rank)==0:
return 0
else:
return max(rank)
Мои решения Время сложность: O (N 2) или O (N 4) Помощь высоко оценили.
@ Марцин Что я должен сказать? Попытайтесь снова сосредоточиться. есть вопрос, о котором я размышляю. – user2290820
И, скорее всего, вы один, если вас не беспокоит привлечение аудитории. – Marcin
@ user2290820: Я думаю, что O (N) и o (N * 2) не сильно отличаются друг от друга. –