存疑:判断终点为什么不能留在搜索部分
判断终点需要在一开始给出
class Solution:
def openLock(self, deadends: List[str], target: str) -> int:
vis =set()
q =deque()
q.append('0000')
step=0
while len(q)>0:
for i in range(len(q)):
s = q.popleft()
if s in deadends:
continue
if s==target:
return step
for i in range(4):
s1 =self.minuslock(s,i)
if s1 not in vis:
vis.add(s1)
q.append(s1)
s2 = self.pluslock(s,i)
if s2 not in vis:
vis.add(s2)
q.append(s2)
step+=1
return -1
对字符串的操作,每一次搜索相邻的方式
不能直接对字符串中元素单独赋值
如果要赋值,必须要先转化成列表
列表转化成字符串直接不能用str 函数
如果列表要转成字符串,必须使用”.Join
def minuslock(self,s,num):
s= list(s)
if s[num]=='0':s[num]='9'
else:s[num]=str(int(s[num])-1)
return ''.join(s)
def pluslock(self,s,num):
s= list(s)
if s[num]=='9':s[num]='0'
else: s[num]=str(int(s[num])+1)
return ''.join(s)
双边BFS搜索(trick)
不再使用队列,而是使用 HashSet 方便快速判断两个集合是否有交集。
from collections import deque
class Solution:
def openLock(self, deadends, target: str) -> int:
vis = set()
q1= set()
q2 =set()
q1.add('0000')
q2.add(target)
step = 0
while len(q1) > 0 and len(q2)>0:
temp = set()
for s in q1:
if s in deadends:
continue
if s in q2:
return step
vis.add(s)
for i in range(4):
s1 = self.minuslock(s, i)
if s1 not in vis:
temp.add(s1)
s2 = self.pluslock(s, i)
if s2 not in vis:
temp.add(s2)
step += 1
q1=q2
q2 =temp
return -1
def minuslock(self, s, num):
s = list(s)
if s[num] == '0':
s[num] = '9'
else:
s[num] = str(int(s[num]) - 1)
return ''.join(s)
def pluslock(self, s, num):
s = list(s)
if s[num] == '9':
s[num] = '0'
else:
s[num] = str(int(s[num]) + 1)
return ''.join(s)