2016-11-18 43 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