存疑:判断终点为什么不能留在搜索部分
判断终点需要在一开始给出
class Solution:def openLock(self, deadends: List[str], target: str) -> int:vis =set()q =deque()q.append('0000')step=0while len(q)>0:for i in range(len(q)):s = q.popleft()if s in deadends:continueif s==target:return stepfor 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+=1return -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 dequeclass Solution:def openLock(self, deadends, target: str) -> int:vis = set()q1= set()q2 =set()q1.add('0000')q2.add(target)step = 0while len(q1) > 0 and len(q2)>0:temp = set()for s in q1:if s in deadends:continueif s in q2:return stepvis.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 += 1q1=q2q2 =tempreturn -1def 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)
