parameters: (self, start, end, bank)
return_statement: return -1
docstring: :type start: str
          :type end: str
          :type bank: List[str]
          :rtype: int
docstring_summary: :type start: str
          :type end: str
          :type bank: List[str]
          :rtype: int
docstring_tokens: : type start : str : type end : str : type bank : List [ str ] : rtype : int
function: def minMutation(self, start, end, bank):
          """
          :type start: str
          :type end: str
          :type bank: List[str]
          :rtype: int
          """
          lookup = {}
          for b in bank:
              lookup[b] = False
  
          q = deque([(start, 0)])
          while q:
              cur, level = q.popleft()
              if cur == end:
                  return level
  
              for i in xrange(len(cur)):
                  for c in ['A', 'T', 'C', 'G']:
                      if cur[i] == c:
                          continue
  
                      next_str = cur[:i] + c + cur[i+1:]
                      if next_str in lookup and lookup[next_str] == False:
                          q.append((next_str, level+1))
                          lookup[next_str] = True
  
          return -1
function_tokens: def minMutation ( self , start , end , bank ) : lookup = { } for b in bank : lookup [ b ] = False q = deque ( [ ( start , 0 ) ] ) while q : cur , level = q . popleft ( ) if cur == end : return level for i in xrange ( len ( cur ) ) : for c in [ 'A' , 'T' , 'C' , 'G' ] : if cur [ i ] == c : continue next_str = cur [ : i ] + c + cur [ i + 1 : ] if next_str in lookup and lookup [ next_str ] == False : q . append ( ( next_str , level + 1 ) ) lookup [ next_str ] = True return - 1