Поиск подстроки в перемешанной строке - PullRequest
1 голос
/ 17 марта 2020

Я пишу скрипт, включающий (word1, word2), который принимает в качестве аргументов две строки и находит, включен ли word1 в word2. Word2 - беспорядочная буква. Должен вернуть Boolean. Также допускается повторение букв, я проверяю, включены ли буквы в оба слова в одном и том же порядке.

>>>includes('queen', 'qwertyuytresdftyuiokn')
True

'королева', ' Q werty U ytr E sdftyuiok N '

Я попытался превратить каждое слово в списки, чтобы было легче работать с каждым элементом. Мой код такой:

def includes(w1, w2):
    w1 = list(w1)
    w2 = list(w2)
    result = False
    for i in w1:
        if i in w2:
            result = True
        else:
            result = False
    return result

Но проблема в том, что мне нужно также проверить, чтобы буквы word1 были в том же порядке в word2, и мой код не контролирует это. Я не мог найти способ реализовать это с помощью списка. Точно так же, как я не мог сделать это много со строками, так что я думаю, что мне нужно использовать другую структуру данных, например словарь, но я не знаю о них много.

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Надеюсь, я понял, в чем ваша цель.
Python - это не мое, но я думаю, что сделал это pythoni c:

def is_subsequence(pattern, items_to_use):
    items_to_use = (x for x in items_to_use)
    return all(any(x == y for y in items_to_use) for x, _ in itertools.groupby(pattern))

https://ideone.com/Saz984

Объяснение:

  • itertools.groupby передает pattern таким образом, что составляющие дубликаты отбрасываются
  • all элементов форма сгруппированная pattern должна соответствовать условиям
  • any использует генератор items_to_use, если он не соответствует текущему элементу. Обратите внимание, что items_to_use должно определяться вне конечного выражения, поэтому прогресс по нему сохраняется каждый раз, когда проверяется следующий элемент из pattern.
2 голосов
/ 17 марта 2020

Если вы не просто проверяете подстроки:

def include(a, b):
    a = "".join(set(a)) # removes duplicates
    if len(a) == 1:
        if a in b:
            return True
        else:
            return False
    else:
        try: 
            pos = b.index(a[0])
            return include(a[1:], b[pos:])
        except:
            return False

print(include('queen', 'qwertyuytresdftyuiokn'))
#True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...