BFS
class Solution:
def minMutation(self, start: str, end: str, bank: List[str]) -> int:
s,bank=set(),set(bank)
if start==end:return 0
q=deque()
q.append((start,0))
s.add(start)
while q:
cur=q.popleft()
for i,c in enumerate(cur[0]):
for cc in ['A','C','G','T']:
if c==cc:continue
cur_new=cur[0][:i]+cc+cur[0][i+1:]
if cur_new not in bank or cur_new in s: continue
if cur_new == end:return cur[1]+1
s.add(cur_new)
q.append((cur_new,cur[1]+1))
return -1
双向BFS
class Solution:
def minMutation(self, start: str, end: str, bank: List[str]) -> int:
def bfs(q:deque,cur_d:dict,d):
qq=deque()
while q:
cur = q.popleft()
for i, c in enumerate(cur[0]):
for cc in ['A', 'C', 'G', 'T']:
if c == cc: continue
cur_new = cur[0][:i] + cc + cur[0][i + 1:]
if cur_new not in bank or cur_new in cur_d: continue
if cur_new in d: return cur[1]+1+d[cur_new],deque()
cur_d[cur_new]=cur[1]+1
qq.append((cur_new, cur[1] + 1))
return -1,qq
bank=set(bank)
if end not in bank:return -1
if start==end:return 0
q1,q2=deque([(start,0)]),deque([(end,0)])
d1,d2=dict(),dict()
d1[start],d2[end]=0,0
while q1 or q2:
if q1:
ans,q1=bfs(q1,d1,d2)
if ans!=-1:return ans
if q2:
ans,q2=bfs(q2,d2,d1)
if ans!=-1:return ans
return -1