2016-11-18 74 views
0

我一直在做更多的CodeEval挑戰,並在hard選項卡上遇到了一個。搜索給定鍵的字符串

給你兩個字符串。確定第二個字符串是否是第一個字符串的子字符串(不要使用任何substr類型庫函數)。第二個字符串可能包含星號(),應將其作爲正則表達式處理,即匹配零個或多個字符。星號可以被\ char字符轉義,在這種情況下,它應該被解釋爲一個普通的''字符。總結一下:字符串可以包含字母,數字,*和\字符。

所以你給出的文件中的兩個字符串是這個樣子:Hello,ell你的任務是要弄清楚,如果ellhello,我做什麼:

我還沒有完全得到它完美,但我確實達到了這個目標,並且完成了65%的工作。它如何貫穿字符串和密鑰,並檢查字符是否匹配。如果字符匹配,它會將該字符附加到列表中。在此之後,它將字符串的長度除以2,並檢查列表的長度是否大於或等於字符串的一半。我認爲一半的字符串長度足以驗證它是否確實匹配。它是如何工作的例子:

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

我的問題是我能做些什麼更好的點,我可以驗證上述通配符?

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

我可以使用'.split()'函數嗎? –

+0

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

+0

@johnsmith如果您看過描述,那不會奏效。 – papasmurf

回答

1

我想出瞭解決這個問題的辦法。你說過「不要使用任何substr類型庫函數」,我不確定如果我使用的某些函數是否允許,請告訴我是否違反了任何規則:D

希望這可以幫助你:)

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

我不認爲你違反了任何規則。不知道爲什麼這個問題是downvoted ..反正,這是真棒,謝謝,你能解釋爲什麼你使用''雖然這有點讓我困惑? – papasmurf

+1

我確定當密鑰包含一個不用於分割密鑰的'\ *'時,我用''替換每個'\ *',然後我將它改回來。例如'5 \ * 6'將變成'5 6'(它不會被分割),那麼它將變成'5 * 6'。 –

+0

這很有道理,這是一個非常聰明的主意。再次感謝你! – papasmurf