2016-11-18 2 views
0

Ich habe noch mehr CodeEval Herausforderungen und stieß auf einen auf der Registerkarte hard.Suche eine Zeichenfolge für einen bestimmten Schlüssel

Sie erhalten zwei Strings. Ermitteln Sie, ob die zweite Zeichenfolge eine Teilzeichenfolge der ersten ist (verwenden Sie keine Bibliotheksfunktion des Teilstr-Typs). Die zweite Zeichenfolge kann ein Sternchen () enthalten, das als ein regulärer Ausdruck behandelt werden sollte, d. H. Mit null oder mehr Zeichen übereinstimmt. Der Stern kann mit einem \ char versehen werden, in diesem Fall sollte er als reguläres '' Zeichen interpretiert werden. Zusammenfassend: Die Zeichenfolgen können Alphabete, Zahlen, * und \ Zeichen enthalten.

So sind Sie zwei Zeichenfolgen in einer Datei gegeben, die wie folgt aussehen: Hello,ell Ihre Aufgabe, um herauszufinden, ist, wenn ell in hello ist, was ich tue:

Ich habe es nicht ganz perfekt geworden , aber ich habe es bis zu dem Punkt geschafft, wo es passiert und arbeitet mit einem 65% komplett. Wie es durch die Zeichenfolge und den Schlüssel verläuft und überprüft, ob die Zeichen übereinstimmen. Wenn die Zeichen übereinstimmen, hängt das Zeichen an eine Liste an. Danach teilt es die Länge des Strings mit 2 und prüft, ob die Länge der Liste größer oder gleich der Hälfte des Strings ist. Ich dachte mir, dass die Hälfte der String-Länge ausreichen würde, um zu überprüfen, ob sie wirklich passt oder nicht. Beispiel dafür, wie es funktioniert:

h == e -> no 
e == e -> yes -> list 
l == e -> no 
l == e -> no 
... 

Meine Frage ist, was kann ich tun, besser zu dem Punkt, wo ich die Platzhalter überprüfen kann, die oben gesagt werden?

import sys 


def search_string(string, key): 
    """ Search a string for a specified key. 
    If the key exists out put "true" if it doesn't output "false" 
    >>> search_string("test", "est") 
    true 
    >>> search_string("testing", "rawr") 
    false""" 
    results = [] 
    for c in string: 
     for ch in key: 
      if c == ch: 
       results.append(c) 
    if len(string)/2 < len(results) or len(string)/2 == len(results): 
     return "true" 
    else: 
     return "false" 


if __name__ == '__main__': 
    with open(sys.argv[1]) as data: 
     for line in data.readlines(): 
      data_list = line.rstrip().split(",") 
      search_key = data_list[1] 
      word = data_list[0] 
      print(search_string(word, search_key)) 
+0

Kann ich die '.split()' Funktion verwenden? –

+0

's = 'string' print 'st'in s ' –

+0

@johnsmith Wenn Sie die Beschreibung lesen würden, würde das nicht funktionieren. – papasmurf

Antwort

1

Ich habe eine Lösung für dieses Problem gefunden. Sie gesagt haben „Verwenden Sie keine substr Typ Bibliotheksfunktion“, ich bin nicht sicher, ob einige der Funktionen, die ich verwendet, erlaubt sind oder nicht, so mir sagen, ob ich irgendwelche Regeln gebrochen habe: D

Hoffe das hilft dir :)

def search_string(string, key): 
    key = key.replace("\\*", "<NormalStar>") # every \* becomes <NormalStar> 
    key = key.split("*") # splitting up the key makes it easier to work with 
    #print(key) 

    point = 0 # for checking order, e.g. test = t*est, test != est*t 
    found = "true" # default 
    for k in key: 
     k = k.replace("<NormalStar>", "*") # every <NormalStar> becomes * 
     if k in string[point:]: # the next part of the key is after the part before 
      point = string.index(k) + len(k) # move point after this 
     else: # k nbt found, return false 
      found = "false" 
      break 

    return found 


print(search_string("test", "est"))  # true 
print(search_string("t....est", "t*est")) # true 
print(search_string("n....est", "t*est")) # false 
print(search_string("est....t", "t*est")) # false 
print(search_string("anything", "*"))  # true 
print(search_string("test", "t\*est")) # false 
print(search_string("t*est", "t\*est")) # true 
+0

Ich glaube nicht, dass du irgendwelche Regeln gebrochen hast. Wundern Sie sich, warum diese Frage abgelehnt wird. Wie auch immer, das ist großartig, danke, können Sie erklären, warum Sie '' verwenden, obwohl das mich irgendwie verwirrt? – papasmurf

+1

Ich habe sichergestellt, dass, wenn der Schlüssel enthält ein '\ *', dass es nicht zum Teilen des Schlüssels verwendet wird, ich ersetzen alle '\ *' mit '', dann ändere ich es später wieder. Zum Beispiel wird "5 \ * 6" zu "5 6" (das nicht aufgeteilt wird), dann wird es zu "5 * 6". –

+0

Das macht Sinn, das ist eine ziemlich schlaue Idee. Danke nochmal! – papasmurf

Verwandte Themen