Разбор задачи: Минимальная генетическая мутация

Предложенный нами код решения:

 def min_mutation(start, end, bank) -> int:
        bfs = [start]
        genes = set(bank)
        cnt = 0
        while bfs:
            arr = []
            for g in bfs:
                if g == end:
                    return cnt
                for i, c in enumerate(g):
                    for new in 'AGTC':
                        if new != c:
                            s = g[:i] + new + g[i + 1:]
                            if s in genes:
                                arr.append(s)
                                genes.discard(s)
            bfs = arr
            cnt += 1
        return -1

Разбор решения задачи

Давайте разберем предложенный код, который реализует поиск минимального количества мутаций для преобразования строки start в строку end с использованием банка генов bank.

1. Определение входных данных и начальная инициализация

bfs = [start]
genes = set(bank)
cnt = 0
  • bfs — это список, используемый для хранения текущих строк, которые нужно проверить. Мы начинаем с исходной строки start.
  • genes — множество, содержащее все допустимые гены из bank, чтобы быстро проверять, есть ли строка в банке.
  • cnt — переменная, которая отслеживает количество шагов (мутаций), необходимых для достижения целевой строки end.

2. Основной цикл поиска

while bfs:
    arr = []
    for g in bfs:
        if g == end:
            return cnt
  • Цикл while выполняется до тех пор, пока есть строки для проверки.
  • Для каждой строки g из bfs проверяется, достигли ли мы целевой строки end. Если да, возвращаем текущее количество мутаций cnt.

3. Генерация возможных мутаций

for i, c in enumerate(g):
    for new in 'AGTC':
        if new != c:
            s = g[:i] + new + g[i + 1:]
            if s in genes:
                arr.append(s)
                genes.discard(s)
  • Цикл for i, c in enumerate(g) проходит по каждому символу строки g.
  • Цикл for new in 'AGTC' перебирает все возможные символы (A, G, T, C).
  • Если символ new отличается от текущего символа c, то создается новая строка s путем замены символа c на new.
  • Если новая строка s содержится в genes, она добавляется в массив arr для проверки на следующем шаге. Также строка удаляется из genes, чтобы избежать повторной обработки.

4. Переход на следующий уровень

bfs = arr
cnt += 1
  • После завершения текущего уровня поиска все допустимые мутации записываются в массив arr, который становится новым списком для проверки bfs.
  • Счетчик cnt увеличивается на 1, так как мы переходим к следующему шагу мутации.

5. Обработка невозможности достижения

return -1
  • Если цикл завершается, а целевая строка end не была достигнута, возвращается -1, указывая на невозможность преобразования.

Пример работы алгоритма

Ввод:
start = "AACCGGTT",
end = "AAACGGTA",
bank = ["AACCGGTA", "AACCGCTA", "AAACGGTA"].

Ход выполнения:

  1. Инициализация:
    • bfs = ["AACCGGTT"]
    • genes = {"AACCGGTA", "AACCGCTA", "AAACGGTA"}
    • cnt = 0
  2. Первый шаг:
    • Проверяем "AACCGGTT":
      • Возможные мутации: "AACCGGTA".
    • bfs = ["AACCGGTA"], cnt = 1.
  3. Второй шаг:
    • Проверяем "AACCGGTA":
      • Возможные мутации: "AAACGGTA".
    • bfs = ["AAACGGTA"], cnt = 2.
  4. Третий шаг:
    • Проверяем "AAACGGTA":
      • Это целевая строка.

Результат: 2 мутации.


 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии