Вы можете просто 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
Вы можете даже сделать это в одну (ну, две) строки, используя all
и any
:
def check(test, control):
it = iter(control)
return all(any(a == b for b in it) for a in test)
Сложность для обоих подходов должна быть O (n), где n - максимальное количество символов.
1) Концептуально это похоже на то, что делает @ jpp , но ИМХО немного понятнее.