2015-04-29 10 views
12

W języku Python, jeśli mam ciąg needle i chcę sprawdzić, czy istnieje (w sposób ciągły) jako podciąg w haystack, wystarczy sprawdzić tylko if needle in haystack.Wyszukiwanie podłańcucha (niepodzielne)

Co dzieje się w przypadku podciągu?

przykład:

haystack = "qabcdzzzefgyyyh" 
needle = "acgh" 

"acgh" jest subsekwencją qabcdzzzefgyyyh - nie istnieje ciągły w haystack, lecz nie nie ciągły. c pojawia się po a, g pojawia się po c, a h pojawia się po g.

+1

Czy możesz podać przykład? – Kasramvd

+1

Czy możesz użyć lepszego słowa do wyjaśnienia? –

+0

Dodano przykład – user4847061

Odpowiedz

9

Nie wiem, czy istnieje funkcja wbudowana, ale jest to dość proste do zrobienia ręcznie

def exists(a, b): 
    """checks if b exists in a as a subsequence""" 
    pos = 0 
    for ch in a: 
     if pos < len(b) and ch == b[pos]: 
      pos += 1 
    return pos == len(b) 
>>> exists("moo", "mo") 
True 
>>> exists("moo", "oo") 
True 
>>> exists("moo", "ooo") 
False 
>>> exists("haystack", "hack") 
True 
>>> exists("haystack", "hach") 
False 
>>> 
+1

Podoba mi się, że ma to liniowy czas złożoności – user4847061

1

inna możliwość: można utworzyć iteratorów dla obu, igły i stogu siana, a następnie pop elementy z pliku haystack-iterator, aż znajdą się wszystkie znaki w igle lub iterator jest wyczerpany.

def is_in(needle, haystack): 
    try: 
     iterator = iter(haystack) 
     for char in needle: 
      while next(iterator) != char: 
       pass 
     return True 
    except StopIteration: 
     return False