当前位置: 首页 > article >正文

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

题目:

题解:

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; 
}

http://www.kler.cn/news/323181.html

相关文章:

  • CentOS 系统中设置宝塔面板开机自启
  • 【习题】应用开发安全
  • OpenCV视频I/O(2)视频采集类VideoCapture之检索视频流的各种属性函数get()的使用
  • WinForm程序嵌入Web网页
  • 【论文解读】ECCV2018细粒度分类:自监督机制NTS-Net模型引领新方向 (附论文地址)
  • 隐蔽通信中KL散度多码字联合与单码字分布
  • Spring Boot打造:小徐影院管理平台
  • SpringCloud Alibaba五大组件之——RocketMQ
  • 【Mysql】Mysql数据库基本操作-------DDL(下)
  • 前端大模型入门:Transformer.js 和 Xenova-引领浏览器端的机器学习变革
  • Kafka与RabbitMQ:深入理解两者之间的区别
  • Rce脚本自动化amp;批量
  • 目标检测系列(三)yolov2的全面讲解
  • ComfyUI 完全入门:基本功能详细介绍(附ComfyUI整合包)
  • 【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)
  • Matlab基础练习
  • 一步步带你Linux内核编译与安装
  • AI编辑器CURSOR_CURSOR安装教程_使用AI进行编码的最佳方式。
  • 论文阅读《Co-clustering for Federated Recommender System》
  • Transformers 引擎,vLLM 引擎,Llama.cpp 引擎,SGLang 引擎,MLX 引擎
  • 每日OJ_牛客_OR59字符串中找出连续最长的数字串_双指针_C++_Java
  • 新茶饮卷出海,本土化成胜败关键
  • 牛肉高脂猫粮,福派斯猫粮新选择?乳鸽猫粮
  • zookeeper 服务搭建(单机)
  • 远程访问软路由
  • [半导体检测-8]:KLA Surfscan 系统设备组成
  • 深度学习----------------------语言模型
  • yolov10安装体验
  • ICM20948 DMP代码详解(48)
  • C# 字符串(String)的应用说明一