Skip to content

Commit f3430cc

Browse files
committed
Update
1 parent 4f7dec8 commit f3430cc

4 files changed

+128
-10
lines changed

Diff for: 1096-Brace-Expansion-II.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Solution:
2+
def braceExpansionII(self, expression: str) -> List[str]:
3+
self.idx=0
4+
def eat_word():
5+
start=self.idx
6+
while self.idx<len(expression) and expression[self.idx].isalpha():
7+
self.idx+=1
8+
return expression[start:self.idx]
9+
def parse():
10+
lst=[""]
11+
ret=set([])
12+
while self.idx<len(expression):
13+
item=expression[self.idx]
14+
if item=="{":
15+
self.idx+=1
16+
tmp=parse()
17+
new_lst=[]
18+
for a in lst:
19+
for b in tmp:
20+
new_lst.append(a+b)
21+
lst=new_lst
22+
elif item=="}":
23+
self.idx+=1
24+
break
25+
elif item==",":
26+
self.idx+=1
27+
for item in lst:
28+
ret.add(item)
29+
lst=[""]
30+
else:
31+
word=eat_word()
32+
for i in range(len(lst)):
33+
lst[i]+=word
34+
if len(lst)>1 or lst[0]!="":
35+
for item in lst:
36+
ret.add(item)
37+
return ret
38+
ret=parse()
39+
return list(sorted(ret))

Diff for: 1263-Minimum-Moves-to-Move-a-Box-to-Thei.py

+40-10
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ def minPushBox(self, grid: List[List[str]]) -> int:
1111
# first check
1212
template=[-1]*w
1313
visited=[template[:] for _ in range(h)]
14+
tin=[template[:] for _ in range(h)]
15+
low=[template[:] for _ in range(h)]
1416
direction=[(1,0),(0,1),(-1,0),(0,-1)]
15-
def dfs(y0,x0,target):
17+
last=[]
18+
def check(y0,x0,target):
1619
tmp=visited[y0][x0]
1720
visited[y0][x0]=-2
1821
flag=False
@@ -21,21 +24,48 @@ def dfs(y0,x0,target):
2124
x1=x0+x_offset
2225
if 0<=y1<h and 0<=x1<w and grid[y1][x1]!="#":
2326
if grid[y1][x1]==target:
27+
last.append((y0,x0))
28+
flag=True
29+
break
30+
elif visited[y1][x1]!=-2 and check(y1,x1,target):
2431
flag=True
2532
break
26-
elif visited[y1][x1]!=-2:
27-
if dfs(y1,x1,target):
28-
flag=True
29-
break
3033
visited[y0][x0]=tmp
3134
return flag
32-
if not (dfs(player[0],player[1],"B") and dfs(box[0],box[1],"T")):
35+
if not (check(player[0],player[1],"B") and check(box[0],box[1],"T")):
3336
return -1
37+
articulation={}
38+
self.timer=1
39+
def dfs(y0,x0,yp,xp):
40+
tin[y0][x0]=self.timer
41+
low[y0][x0]=self.timer
42+
self.timer+=1
43+
cnt=0
44+
for y_offset,x_offset in direction:
45+
y1=y0+y_offset
46+
x1=x0+x_offset
47+
if 0<=y1<h and 0<=x1<w and grid[y1][x1]!="#":
48+
if yp==y1 and xp==x1:
49+
continue
50+
elif tin[y1][x1]!=-1:
51+
low[y0][x0]=min(low[y0][x0],tin[y1][x1])
52+
else:
53+
cnt+=1
54+
dfs(y1,x1,y0,x0)
55+
low[y0][x0]=min(low[y0][x0],low[y1][x1])
56+
if low[y1][x1]>=tin[y1][x1] and yp!=-1:
57+
articulation[(y0,x0)]=1
58+
if yp==-1 and cnt>1:
59+
articulation[(y0,x0)]=1
60+
for y in range(h):
61+
for x in range(w):
62+
if tin[y][x]==-1:
63+
dfs(y,x,-1,-1)
64+
queue=[(*box,*(last[0]))]
3465
visited[box[0]][box[1]]=0
3566
step=0
36-
queue=[box]
3767
while queue:
3868
target=[]
39-
for y0,x0 in queue:
40-
41-
return -1
69+
step+=1
70+
for y0,x0,ys,xs in queue:
71+

Diff for: 888-Fair-Candy-Swap.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution:
2+
def fairCandySwap(self, A: List[int], B: List[int]) -> List[int]:
3+
a=sum(A)
4+
b=sum(B)
5+
diff=(a-b)//2
6+
record={}
7+
for item in B:
8+
record[item]=1
9+
for item in A:
10+
if item-diff in record:
11+
return [item,item-diff]

Diff for: 954-Array-of-Doubled-Pairs.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution:
2+
def canReorderDoubled(self, A: List[int]) -> bool:
3+
record={}
4+
for item in A:
5+
record[item]=record.get(item,0)+1
6+
if record.get(0,0)%2==1:
7+
return False
8+
elif 0 in record:
9+
del record[0]
10+
last=len(record)+1
11+
while last!=len(record):
12+
last=len(record)
13+
for key in list(record.keys()):
14+
if key not in record:
15+
continue
16+
if key%2!=0:
17+
if record.get(key*2,0)<record[key]:
18+
return False
19+
record[key*2]-=record[key]
20+
if record[key*2]==0:
21+
del record[key*2]
22+
del record[key]
23+
else:
24+
half=record.get(key//2,0)
25+
double=record.get(key*2,0)
26+
if half+double<record[key]:
27+
return False
28+
if half==0:
29+
record[key*2]-=record[key]
30+
if record[key*2]==0:
31+
del record[key*2]
32+
del record[key]
33+
elif double==0:
34+
record[key//2]-=record[key]
35+
if record[key//2]==0:
36+
del record[key//2]
37+
del record[key]
38+
return len(record)==0

0 commit comments

Comments
 (0)