PS: これは、2 つのシーケンス間のオーバーラップを見つけて返す方法の複製ではありません。
[以下の問題に適用できる場合は、上記のアプローチで解決策を求めますが]
Q: うまくいきましたが、まだスケーラブルなソリューションではなく、明らかに最適化されていません (スコアが低い)。問題の次の説明を読んで、より良い解決策を提供してください。
質問:
簡単にするために、接頭辞と接尾辞は空ではなく、文字列 S 全体よりも短い必要があります。文字列の境界はS
、接頭辞と接尾辞の両方である任意の文字列です。たとえば、"cut"
は文字列の境界線であり、文字列"cutletcut"
には と の"barbararhubarb"
2 つの境界線が"b"
あり"barb"
ます。
class Solution { public int solution(String S); }
S
これは、文字で構成される文字列を指定すると、指定された文字列N
で少なくとも 3 つの重複しないオカレンスを持つ最長の境界線の長さを返します。にそのような境界線がない場合S
、関数は 0 を返す必要があります。
例えば、
- 上記で説明したように
S = "barbararhubarb"
、関数が を返す必要がある場合。1
S = "ababab"
関数が を返す必要がある場合、と2
は"ab"
どちら"abab"
も の境界ですが、重複しないオカレンスは 3 つS
しかありません。"ab"
- 唯一の境界線が 2 回しか発生しない
S = "baaab"
ため、関数が を返す必要がある場合。0
"b"
と仮定する:
N
範囲内の整数です[0..1,000,000]
。- string
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) 助けていただければ幸いです。