Программа курса:
Разбор задачи: Минимальная генетическая мутация
Предложенный нами код решения:
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"].
Ход выполнения:
- Инициализация:
bfs = ["AACCGGTT"]genes = {"AACCGGTA", "AACCGCTA", "AAACGGTA"}cnt = 0
- Первый шаг:
- Проверяем
"AACCGGTT":- Возможные мутации:
"AACCGGTA".
- Возможные мутации:
bfs = ["AACCGGTA"],cnt = 1.
- Проверяем
- Второй шаг:
- Проверяем
"AACCGGTA":- Возможные мутации:
"AAACGGTA".
- Возможные мутации:
bfs = ["AAACGGTA"],cnt = 2.
- Проверяем
- Третий шаг:
- Проверяем
"AAACGGTA":- Это целевая строка.
- Проверяем
Результат: 2 мутации.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии