forked from kamyu104/LeetCode-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pyramid-transition-matrix.py
37 lines (33 loc) · 1.5 KB
/
pyramid-transition-matrix.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Time: O((a^(b+1)-a)/(a-1)) = O(a^b) , a is the size of allowed,
# b is the length of bottom
# Space: O((a^(b+1)-a)/(a-1)) = O(a^b)
class Solution(object):
def pyramidTransition(self, bottom, allowed):
"""
:type bottom: str
:type allowed: List[str]
:rtype: bool
"""
def pyramidTransitionHelper(bottom, edges, lookup):
def dfs(bottom, edges, new_bottom, idx, lookup):
if idx == len(bottom)-1:
return pyramidTransitionHelper("".join(new_bottom), edges, lookup)
for i in edges[ord(bottom[idx])-ord('A')][ord(bottom[idx+1])-ord('A')]:
new_bottom[idx] = chr(i+ord('A'))
if dfs(bottom, edges, new_bottom, idx+1, lookup):
return True
return False
if len(bottom) == 1:
return True
if bottom in lookup:
return False
lookup.add(bottom)
for i in xrange(len(bottom)-1):
if not edges[ord(bottom[i])-ord('A')][ord(bottom[i+1])-ord('A')]:
return False
new_bottom = ['A']*(len(bottom)-1)
return dfs(bottom, edges, new_bottom, 0, lookup)
edges = [[[] for _ in xrange(7)] for _ in xrange(7)]
for s in allowed:
edges[ord(s[0])-ord('A')][ord(s[1])-ord('A')].append(ord(s[2])-ord('A'))
return pyramidTransitionHelper(bottom, edges, set())