Рубрики
Без рубрики

Перестановки

«Учитывая набор различных чисел, найти все его перестановки. «Совсем недавно я застрял на этом … Теги с Python, программированием, компьютером, перестановками.

«Учитывая набор различных чисел, найдите все его перестановки».

Совсем недавно я застрял на эту проблему и оказался с использованием метода грубой силы, которая была не только неэффективной, не совсем не решила проблему.

Я обнаружил, по крайней мере, два способа решить эту должность (Grokkking кодирующее интервью: шаблоны для кодирования вопросов .. (N.d.) Один из способов намного превосходит на основе сложности времени. Начнем с менее эффективной структуры:

Структура Структура со временем сложности O (N * N!)

# subsets_str_perm.py
#   Given a set of distinct letters, find all of its permutations.
# by: Scott Gordon

from collections import deque


def get_permutation(string):
    string_length = len(string)
    result = []
    permutations = deque()
    permutations.append([])
    for current_letter in string:
        # Take all permutations and add current num to make new permutation
        s = len(permutations)
        for _ in range(s):
            old_permutation = permutations.popleft()
            # Create new permutation by adding current num @ every position
            for j in range(len(old_permutation) + 1):
                new_permutation = list(old_permutation)
                new_permutation.insert(j, current_letter)
                if len(new_permutation) == string_length:
                    result.append(new_permutation)
                else:
                    permutations.append(new_permutation)

    return result


def find_permutation(string, pattern):
    permuted_pattern = get_permutation(pattern)
    for substring in permuted_pattern:
        s = "".join(substring)
        if s in string:
            result = True
            break
        else:
            result = False
    return result


def main():
    print("Permutation exist: " + str(find_permutation("oidbcaf", "abc")))
    print("Permutation exist: " + str(find_permutation("odicf", "dc")))
    print("Permutation exist: " + str(find_permutation("bcdxabcdy", "bcdyabcdx")))
    print("Permutation exist: " + str(find_permutation("aaacb", "abc")))


main()

Далее давайте посмотрим на более эффективный шаблон:

Шаблон скольжения окна со сложностью времени O (n)

# sliding_win_str_perm.py
#    Given a set of distinct numbers, find all of its permutations
# by: Scott Gordon


def find_permutation(str1, pattern):
    window_start, matched = 0, 0
    char_frequency = {}
    # Create a HashMap to calculate frequencies of all chars in pattern.
    for chr in pattern:
        if chr not in char_frequency:
            char_frequency[chr] = 0
        char_frequency[chr] += 1

    # Iterate through string, add one char at a time to sliding window.
    for window_end in range(len(str1)):
        right_char = str1[window_end]
        if right_char in char_frequency:
            # If added char matches HashMap char, decrement map frequency. If
            # char frequency zero, complete match.
            char_frequency[right_char] -= 1
            if char_frequency[right_char] == 0:
                matched += 1

        # If num of char matched equal to num of distinct chars in
        # pattern (total chars in HashMap), required permutation
        # achieved.
        if matched == len(char_frequency):
            return True

        # If win size > len of pattern, shrink win to make == pattern size.
        # If outgoing char part of pattern, put back in frequency HashMap.
        if window_end >= len(pattern) - 1:
            left_char = str1[window_start]
            window_start += 1
            if left_char in char_frequency:
                if char_frequency[left_char] == 0:
                    matched -= 1
                char_frequency[left_char] += 1

    return False


def main():
    print("Permutation exist: " + str(find_permutation("oidbcaf", "abc")))
    print("Permutation exist: " + str(find_permutation("odicf", "dc")))
    print("Permutation exist: " + str(find_permutation("bcdxabcdy", "bcdyabcdx")))
    print("Permutation exist: " + str(find_permutation("aaacb", "abc")))


main()

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

Использованная литература:

Grokking Кодирование собеседования: Узоры для кодирования вопросов .. (N.D.). www.uducative. Ио Отказ Получено 3, 2021 октября, от https://www.educative.io/courses/grokking-the-coding-inteview.

Фото Жан-Луи Полину на Бессмысленно

Оригинал: “https://dev.to/sagordondev/permutations-3nmd”