3 回答
TA贡献1775条经验 获得超11个赞
您可以使用find(letter, last_index)在处理过的字母后查找所需字母的出现。
def same_order_in(test, control):
index = 0
control = control.lower()
for i in test.lower():
index = control.find(i, index)
if index == -1:
return False
# index += 1 # uncomment to check multiple occurrences of same letter in test string
return True
如果测试字符串有重复的字母,如:
test_string = 'Diih'
control_string = 'Danish'
带注释行 same_order_in(test_string, control_string) == True
并带有未注释的行 same_order_in(test_string, control_string) == False
TA贡献1886条经验 获得超2个赞
您可以仅join将字符串中的test字符转换为正则表达式,允许.*其间包含任何其他字符,然后re.search是control字符串中的该模式。
>>> test, control = "Dih", "Danish"
>>> re.search('.*'.join(test), control) is not None
True
>>> test, control = "Tbl", "Bottle"
>>> re.search('.*'.join(test), control) is not None
False
在不使用正则表达式的情况下,您可以iter从control字符串创建一个并使用两个嵌套循环,1) break从内部循环开始并else返回,False直到test在control. 重要的是创建iter, 即使control已经是可迭代的,这样内部循环将在上次停止的地方继续。
def check(test, control):
it = iter(control)
for a in test:
for b in it:
if a == b:
break
else:
return False
return True
您甚至可以使用alland在一行(好吧,两行)中执行此操作any:
def check(test, control):
it = iter(control)
return all(any(a == b for b in it) for a in test)
这两种方法的复杂度应该是 O(n),n 是最大字符数。
TA贡献1848条经验 获得超2个赞
这是一种解决方案。我们的想法是通过遍历control字符串第一,如果接下来的比赛产生一个值test字符。如果匹配的总数等于 的长度test,则满足您的条件。
def yield_in_order(x, y):
iterstr = iter(x)
current = next(iterstr)
for i in y:
if i == current:
yield i
current = next(iterstr)
def checker(test, control):
x = test.lower()
return sum(1 for _ in zip(x, yield_in_order(x, control.lower()))) == len(x)
test1, control1 = 'Tbl', 'Bottle'
test2, control2 = 'Dih', 'Danish'
print(checker(test1, control1)) # False
print(checker(test2, control2)) # True
如果您需要一些附加信息,例如在找到中断之前对齐了多少个字母,您可以简单地将checker函数调整为 return sum(1 for _ in zip(x, yield_in_order(...)))。
添加回答
举报