2015-04-29 14 views
12

पाइथन में यदि मेरे पास स्ट्रिंग needle है और मैं देखना चाहता हूं कि यह haystack में एक सबस्ट्रिंग के रूप में मौजूद है (contiguously), मुझे केवल if needle in haystack जांचना होगा।सबस्ट्रिंग ढूंढना (nonconsecutive)

बाद के मामले में क्या होता है?

उदाहरण:

haystack = "qabcdzzzefgyyyh" 
needle = "acgh" 

"acgh" qabcdzzzefgyyyh की किसी परिणाम है - haystack में समीपवर्ती मौजूद नहीं है, लेकिन यह गैर समीपवर्ती करता है। ca के बाद प्रकट होता है, gc के बाद प्रकट होता है, और hg के बाद प्रकट होता है।

+1

क्या आप एक उदाहरण दे सकते हैं? – Kasramvd

+1

क्या आप व्याख्या करने के लिए बेहतर शब्दों का उपयोग कर सकते हैं? –

+0

एक उदाहरण जोड़ा गया – user4847061

उत्तर

9

मैं वहाँ अगर builtin समारोह पता नहीं है, लेकिन यह मैन्युअल

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

मुझे पसंद है कि इसमें रैखिक समय जटिलता है – user4847061

1

एक और संभावना है करने के लिए नहीं बल्कि सरल है: आप दोनों, सुई और भूसे के ढेर के लिए iterators बना सकते हैं, और उसके बाद हैस्टैक-इटरेटर से पॉप तत्व जब तक कि सुई में सभी पात्र पाए जाते हैं, या इटेटरेटर समाप्त हो जाता है।

def is_in(needle, haystack): 
    try: 
     iterator = iter(haystack) 
     for char in needle: 
      while next(iterator) != char: 
       pass 
     return True 
    except StopIteration: 
     return False 
संबंधित मुद्दे