PS:这不是如何找到2个序列之间的重叠,并返回它的副本
[虽然我要求上述方法的解决方案是否可以应用于以下问题]
问:虽然我做对了,但它仍然不是一个可扩展的解决方案,而且肯定没有优化(得分低)。阅读以下问题描述,并提供更好的解决方案。
问题:
为简单起见,我们要求前缀和后缀不为空且比整个字符串 S 短。字符串的边界S
是任何既是前缀又是后缀的字符串。例如,"cut"
是一个字符串的边框"cutletcut"
,而一个字符串"barbararhubarb"
有两个边框:"b"
和"barb"
。
class Solution { public int solution(String S); }
即,给定一个由字符S
组成的字符串N
,返回在给定字符串中至少出现三个不重叠的最长边框的长度。如果 中没有这样的边框S
,则该函数应返回 0。
例如,
- 如果
S = "barbararhubarb"
函数应该返回1
,如上所述; - 如果
S = "ababab"
函数应该返回2
, as"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) 非常感谢帮助。