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) 助けていただければ幸いです。