C语言 | Leetcode C语言题解之第433题最小基因变化

题目:

题解:

cpp 复制代码
int minMutation(char * start, char * end, char ** bank, int bankSize) {
    int m = strlen(start);
    int **adj = (int **)malloc(sizeof(int *) * bankSize);
    int endIndex = -1;
    for (int i = 0; i < bankSize; i++) {
        adj[i] = (int *)malloc(sizeof(int) * bankSize);
        memset(adj[i], 0, sizeof(int) * bankSize);
    }
    for (int i = 0; i < bankSize; i++) {
        if (!strcmp(end, bank[i])) {
            endIndex = i;
        }
        for (int j = i + 1; j < bankSize; j++) {
            int mutations = 0;
            for (int k = 0; k < m; k++) {
                if (bank[i][k] != bank[j][k]) {
                    mutations++;
                }
                if (mutations > 1) {
                    break;
                }
            }
            if (mutations == 1) {
                adj[i][j] = 1;
                adj[j][i] = 1;
            }
        }
    }
    if (endIndex == -1) {
        return -1;
    }

    int *queue = (int *)malloc(sizeof(int) * bankSize);
    bool *visited = (bool *)malloc(sizeof(bool) * bankSize);
    memset(visited, 0, sizeof(bool) * bankSize);
    int head = 0;
    int tail = 0;
    int step = 1;
    for (int i = 0; i < bankSize; i++) {
        int mutations = 0;
        for (int k = 0; k < m; k++) {
            if (start[k] != bank[i][k]) {
                mutations++;
            }
            if (mutations > 1) {
                break;
            }
        }
        if (mutations == 1) {
            queue[tail++] = i;
            visited[i] = true;
        }
    }        
    while (head != tail) {
        int sz = tail - head;
        for (int i = 0; i < sz; i++) {
            int curr = queue[head++];
            if (curr == endIndex) {
                for (int i = 0; i < bankSize; i++) {
                    free(adj[i]);
                }
                free(adj);
                free(queue);
                free(visited);
                return step;
            }
            for (int j = 0; j < bankSize; j++) {
                if (visited[j] || !adj[curr][j]) {
                    continue;
                }
                visited[j] = true;
                queue[tail++] = j;
            }
        }
        step++;
    }
    for (int i = 0; i < bankSize; i++) {
        free(adj[i]);
    }
    free(adj);
    free(queue);
    free(visited);
    return -1; 
}
相关推荐
爱聊灵光的维C1 小时前
从看见世界到重构认知:在视觉与硬件的交汇处,寻找我们这代人的北极星
c语言·物联网·计算机视觉·重构·硬件工程·射频工程
文丑颜不良啊1 小时前
LeetCode1661~1680题目解析
java·leetcode
AI+程序员在路上1 小时前
RV1126B 上支持的模型及全流程应用--从CNN及语音到 LLMVLM 与跨平台选型
linux·c语言·人工智能
揽星河..2 小时前
【C语言】扫雷游戏
c语言·算法·游戏
冻柠檬飞冰走茶4 小时前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
冻柠檬飞冰走茶4 小时前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
文丑颜不良啊9 小时前
LeetCode1721~1740题目解析
java·leetcode
Lxx_Zw9 小时前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·stm32·单片机·嵌入式硬件
文丑颜不良啊10 小时前
LeetCode1681~1700题目解析
java·leetcode
开开心心就好10 小时前
网页图片批量下载工具,输入链接就保存
服务器·算法·leetcode·支持向量机·pdf·ocr·1024程序员节