2015-04-29 11 views
12

Python'da needle dizgisi varsa ve haystack içinde bir alt dizgi olarak var olup olmadığını görmek istiyorum, sadece if needle in haystack'u denetlemem gerekiyor.Alt tabaka bulma (arka arkaya olmayan)

Bir sonraki durumda ne olur?

Örnek:

haystack = "qabcdzzzefgyyyh" 
needle = "acgh" 

"aCGH" qabcdzzzefgyyyh bir dizisi olan - haystack içinde bitişik olarak var olmayan, ancak olmayan bitişik yapar. c, a'dan sonra görüntüleniyor,'dan sonra g görüntüleniyor ve h, g'dan sonra görüntüleniyor.

+1

Bir örnek verebilir misiniz? – Kasramvd

+1

Açıklamak için daha iyi kelimeler kullanabilir misiniz? –

+0

Bir örnek eklendi – user4847061

cevap

9

yerleşik fonksiyon olup olmadığını bilmiyorum, ama elle

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

Bunun doğrusal zaman karmaşıklığına sahip olmasını seviyorum – user4847061

1

başka olasılık yapmak oldukça basittir: Daha sonra hem iğne ve samanlık için yineleyicileri oluşturabilir ve haystack-yineleyiciden pop öğelerini, iğne içindeki tüm karakterler bulunana veya yineleyici tükenene kadar.

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