|
|
11#

楼主 |
发表于 2021-12-18 18:36
来自手机
|
只看该作者
s=[1,2,3,4,3,2,5]
ml=[0 for i in range(len(s))]
mr=[len(s)-1 for i in range(len(s))]
#ml,mr分别保存每个位置的最长左右子串的终点位置
def pre(s):
x=len(s)
for i in range(x):
for j in range(i+1,x):
if s[j]==s[i]:
mr[i]=j-1
break
for j in range(i-1,0,-1):
if s[j]==s[i]:
ml[i]=j+1
break
pre(s)
>>> ml
[0, 0, 0, 0, 3, 2, 0]
>>> mr
[6, 4, 3, 6, 6, 6, 6]
>>> s
[1, 2, 3, 4, 3, 2, 5]
def j3(b,e):
x=[]
l,r=s[b],s[e]
if l!=r and mr[b] >=e and ml[e] <=b:
if e-b==2:
x.append(1)
else:
for i in range(1,e-b):
if mr[b+i] >=e and ml[b+i] <=b:
x.append(i)
return len(x),x
def lp3(s):
cnt=0
for b in range(0,len(s)-2):
for e in range(b+2,len(s)):
s1=s[b:e+1]
#print("test ",s1)
c,x=j3(b,e)
if c>0:
#print(s1)
#for y in x:
#print("lead",(b+1,b+y+1,e+1))
cnt+=c
print("cnt=",cnt)
>>> lp3(s)
cnt= 19600
>>> s=list(range(200))
>>> ml=[0 for i in range(len(s))]
>>> mr=[len(s)-1 for i in range(len(s))]
>>> pre(s)
>>> t=time.time();lp(s);print(time.time()-t)
cnt= 1313400
11.5908203125
>>> t=time.time();lp3(s);print(time.time()-t)
cnt= 1313400
1.029601812362671
#比原始快了10倍
>>> s=list(range(300))
>>> ml=[0 for i in range(len(s))]
>>> mr=[len(s)-1 for i in range(len(s))]
>>> pre(s)
>>> t=time.time();lp3(s);print(time.time()-t)
cnt= 4455100
3.2916059494018555
#不保存领队,只计数
def j4(b,e):
x=[]
l,r=s[b],s[e]
c=0
if l!=r and mr[b] >=e and ml[e] <=b:
if e-b==2:
c=1
else:
for i in range(1,e-b):
if mr[b+i] >=e and ml[b+i] <=b:
c+=1
return c
def lp4(s):
cnt=0
for b in range(0,len(s)-2):
for e in range(b+2,len(s)):
c=j4(b,e)
if c>0:
cnt+=c
print("cnt=",cnt)
>>> t=time.time();lp4(s);print(time.time()-t)
cnt= 4455100
3.057605504989624
#没有提高 |
|