Java&C++题解与拓展——leetcode433.最小基因变化【A star学习、双向BFS(C++超时)、链式前向星(报错)】

每日一题做题记录,参考官方和三叶的题解

题目要求

在这里插入图片描述

思路一:BFS

  • 找从 s t a r t start start状态到 e n d end end状态的最小步数;
  • 用哈希表存每个状态和步数;
  • 维护一个遍历队列,取队头元素 c u r cur cur,依次替换每一位得到下一个可能状态,合法(出现在bank中)即加入队列并更新步数;
  • 直到下一个可能状态与 e n d end end相等,返回 s t e p + 1 step+1 step+1

Java

class Solution {
   
    static char[] items = new char[]{
   'A', 'C', 'G', 'T'};
    public int minMutation(String start, String end, String[] bank) {
   
        Set<String> bankSet = new HashSet<>();
        for(String s : bank)
            bankSet.add(s);

        Deque<String> que = new ArrayDeque<>();
        Map<String, Integer> map = new HashMap<>();
        que.addLast(start);
        map.put(start, 0); // 步数为0

        while(!que.isEmpty()) {
   
            String cur = que.pollFirst();
            char[] cs = cur.toCharArray();
            int step = map.get(cur);
            for(int i = 0; i < 8; i++) {
   
                for(char c : items) {
   
                    if(cs[i] == c)
                        continue;
                    char[] clone = cs.clone();
                    clone[i] = c; // 换第i位为c
                    String nxt = String.valueOf(clone);
                    if(!bankSet.contains(nxt)) // 是否合法出现在bank里
                        continue;
                    if(map.containsKey(nxt)) // 是否记录过
                        continue;
                    if(nxt.equals(end)) // 是否到结尾
                        return step + 1;
                    map.put(nxt, step + 1); // 更新步数
                    que.addLast(nxt); // 压入队列
                }
            }
        }
        return -1;
    }
}
  • 时间复杂度: O ( C × n ) O(C\times n) O(C×n),其中 C = 32 = 8 × 4 C=32=8\times4 C=32=8×4,即四个基因分别替换八个位置
  • 空间复杂度: O ( n ) O(n) O(n)

C++

static char items[4] = {
   'A', 'C', 'G', 'T'};
class Solution {
   
public:
    int minMutation(string start, string end, vector<string>& bank) {
   
        queue<string> que;
        unordered_map<string, int> map;
        que.push(start);
        map[start] = 0; // 步数为0

        while(!que.empty()) {
   
            string cur = que.front();
            que.pop();
            int step = map[cur];
            for(int i = 0; i < 8; i++) {
   
                for(char c :items) {
   
                    if(cur[i] == c)
                        continue;
                    string nxt = cur;
                    nxt[i] = c; // 换第i位为c
                    if(find(bank.begin(), bank.end(), nxt) == bank.end()) // 是否合法出现在bank里
                        continue;
                    if(map.count(nxt)) // 是否记录过
                        continue;
                    if(nxt == end) // 是否到结尾
                        return step + 1;
                    map[nxt] = step + 1;  // 更新步数
                    que.push(nxt);
                    
                }
            }
        }
        return -1;
    }
};
  • 时间复杂度: O ( C × n ) O(C\times n) O(C×n),其中 C = 32 = 8 × 4 C=32=8\times4 C=32=8×4,即四个基因分别替换八个位置
  • 空间复杂度: O ( n ) O(n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值