【C语言】Leetcode 433. 最小基因变化

本文介绍了使用BFS解决LeetCode 433问题的方法。通过建立队列,每次寻找与目标基因仅有一个字符不同的字符串,并将它们加入队列。同时利用状态数组记录已访问过的基因,防止重复搜索。当找到目标基因时,返回步数。队列遍历直至找到目标基因或队列为空。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:
1、此题与127题相似,采用BFS(广度优先搜索算法)+ 队列方式进行遍历,同时将相关的遍历的步数step返回给函数。
2、详细分析,通过建立一个queue队列,每次检索出现的符合OneDiff不同的字符串,会从队尾进入队列。同时队列的前面会不断的判断是否满足跟end相同的字符串,如果相同就结束,返回相应的step值。如果不同的话,会沿着队列继续往下搜索。
3、通过一个状态数组visit[],记录每个元素的状态值,该元素已经访问过,则给这个元素标记一个状态,避免重复访问。
4、队列的结束条件并不是把整个数组遍历完成,而是把整个队列遍历完成,所以判断条件是队头和队尾是不是相同。

#define MAX_CNT 10000

int IsOneDiff(char *str1, char *str2 ){
    int count = 0;
    int len = strlen(str1);
    for(int i = 0; i < len; i++){
        if(str1[i] != str2[i]){
            count++;
        }
    }
    if(count == 1) {
        return 1;
    }
    return 0;
}

int minMutation(char * start, char * end, char ** bank, int bankSize){
    if(start == NULL || end == NULL || bank == NULL){
        return -1;
    }
    if(bankSize == 0){
        return -1;
    }
    int i;
    for(i = 0; i < bankSize; i++){
        if(strcmp (bank[i], end) == 0){
            break;
        }
    }
    if (i == bankSize){
        return -1;
    }
    if(IsOneDiff(start, end)){
        return 1;
    }

    int queue[MAX_CNT] = {0};
    int visit[MAX_CNT] = {0};
    int step[MAX_CNT] = {0};
    int head = 0;
    int tail = 0;

    for(int i = 0; i < bankSize; i++){
        if(IsOneDiff(start, bank[i])){
            step[i] = 1;
            visit[i] = 1;
            queue[tail++] = i;
        }
    }

    while(head != tail){
        for(int i = 0; i < bankSize; i++){
            if(visit[i] == 1 || IsOneDiff(bank[queue[head]],bank[i]) == 0){
                continue;
            }
            if(strcmp(end, bank[i]) == 0){
                return step[queue[head]]+1;
            }
            queue[tail++] = i;
            visit[i] = 1;
            step[i] = step[queue[head]] + 1;
        }
        head++;
    }  
    return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值