LeetCode //C – 433. Minimale genetische Mutation

433. Minimale genetische Mutation

Eine Genzeichenfolge kann durch eine 8 Zeichen lange Zeichenfolge dargestellt werden, mit der Auswahl „A“, „C“, „G“ und „T“.

Angenommen, wir müssen eine Mutation von einem Genstring startGene zu einem Genstring endGene untersuchen, wobei eine Mutation als ein einzelnes Zeichen definiert ist, das in dem Genstring geändert wurde.

  • Beispielsweise ist „AACCGGTT“ -> „AACCGGTA“ eine Mutation.

Außerdem gibt es eine Genbank, die alle gültigen Genmutationen erfasst. Ein Gen muss in der Bank vorhanden sein, damit es zu einer gültigen Genkette wird.

Geben Sie anhand der beiden Genketten startGene und endGene sowie der Genbank die Mindestanzahl an Mutationen zurück, die für die Mutation von startGene zu endGene erforderlich sind. Wenn keine solche Mutation vorliegt, geben Sie -1 zurück.

Beachten Sie, dass davon ausgegangen wird, dass der Startpunkt gültig ist, sodass er möglicherweise nicht in der Bank enthalten ist.
 

Beispiel 1:

Eingabe: startGene = „AACCGGTT“, endGene = „AACCGGTA“, bank = [“AACCGGTA“]
Ausgabe: 1

Beispiel 2:

Eingabe: startGene = „AACCGGTT“, endGene = „AAACGGTA“, bank = [„AACCGGTA“, „AACCGCTA“, „AAACGGTA“]
Ausgabe: 2

Einschränkungen:
  • 0 <= bank.length <= 10
  • startGene.length == endGene.length == bank[i].length == 8
  • startGene, endGene und bank[i] bestehen nur aus den Zeichen ['A', 'C', 'G', 'T'].

Von: LeetCode
Link: 433. Minimale genetische Mutation


Lösung:

Ideen:

1. Initialisierung

  • „visited“ ist ein Array, das verwendet wird, um zu verfolgen, welche Gene in der Bank besucht wurden.
  • Die Warteschlange ist ein dynamisch zugewiesenes Array, das zur Durchführung von BFS verwendet wird und die zu verarbeitenden Gene enthält. Es verfügt über bankSize + 1-Slots zur Aufnahme des startGene und der Gene in der Bank.
  • vorne und hinten sind Variablen, die zur Verwaltung der Warteschlange verwendet werden.
  • Level wird verwendet, um die Anzahl der Mutationen zu zählen.

2. Breitensuche (BFS)

  • StartGene in die Warteschlange stellen: Das StartGen wird in die Warteschlange eingereiht und BFS beginnt.
  • Jede Ebene verarbeiten: Für jede Ebene in BFS verarbeitet der Code alle Gene, die sich derzeit in der Warteschlange befinden. Für jedes Gen in der Warteschlange wird es mit jedem Gen in der Bank verglichen.
  • Gültige Mutationen in die Warteschlange stellen: Wenn ein Gen in der Bank eine gültige Mutation ist (sich um genau ein Zeichen unterscheidet) und nicht besucht wurde, wird es als besucht markiert und zur Verarbeitung in der nächsten BFS-Ebene in die Warteschlange eingereiht.
  • Auf EndGene prüfen: Wenn das endGene in der Warteschlange gefunden wird, gibt die Funktion die Stufe zurück, die die Mindestanzahl an Mutationen darstellt. Wenn die Warteschlange erschöpft ist und endGene nicht gefunden wurde, gibt die Funktion -1 zurück, was darauf hinweist, dass es keinen gültigen Mutationspfad von startGene zu endGene gibt.
Code:
int minMutation(char * startGene, char * endGene, char ** bank, int bankSize) {
    
    
    if (bankSize == 0) return -1;
    
    int *visited = (int *)calloc(bankSize, sizeof(int));
    char **queue = (char **)malloc((bankSize + 1) * sizeof(char *));
    int front = 0, rear = 0;
    
    queue[rear++] = startGene;
    int level = 0;
    
    while (front < rear) {
    
    
        int size = rear - front;
        for (int i = 0; i < size; ++i) {
    
    
            char *gene = queue[front++];
            if (strcmp(gene, endGene) == 0) {
    
    
                free(visited);
                free(queue);
                return level;
            }
            for (int j = 0; j < bankSize; ++j) {
    
    
                if (visited[j]) continue;
                int diff = 0;
                for (int k = 0; k < 8; ++k) {
    
    
                    if (gene[k] != bank[j][k]) ++diff;
                    if (diff > 1) break;
                }
                if (diff == 1) {
    
    
                    visited[j] = 1;
                    queue[rear++] = bank[j];
                }
            }
        }
        ++level;
    }
    
    free(visited);
    free(queue);
    return -1;
}

Guess you like

Origin blog.csdn.net/navicheung/article/details/133375326