我已经进行了一些CodeEval
次挑战,并在hard标签上遇到了一个。
你有两个字符串。确定第二个字符串是否是第一个字符串的子字符串(不要使用任何substr类型库函数)。第二个字符串可能包含星号(),应将其视为正则表达式,即匹配零个或多个字符。星号可以通过\ char进行转义,在这种情况下,它应该被解释为常规' '字符。总结一下:字符串可以包含字母,数字,*和\字符。
因此,您在文件中看到两个字符串,如下所示:Hello,ell
您的工作是确定ell
是否在hello
中,我做了什么:
我还没有完美地完成它,但我确实已经达到它通过的程度并且完成了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 :(得分:1)
我想出了解决这个问题的方法。您已经说过“不要使用任何子类型库函数”,我不确定我是否允许使用某些函数,所以告诉我是否违反了任何规则: 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