栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode——433.最小基因变化

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode——433.最小基因变化

通过万岁!!!

  • 题目:就是给你一个start的字符串,然后每次变换一个字符,要求变换到end字符,并且中途的变化中,都要求在bank这个数组中。
  • 思路:
    • 其实就是一个路径的问题,这里就是从某一点开始,然后经过bank中的路径,怎么样能最快到达end。看到路径最短,其实就是用广度优先就可以了。
    • 跟蓝桥杯的跳马问题优点相似。但是唯一的不同就是,这里的第几层怎么确定。有一个常规的做法,就是我们把上一层的长度保存下来,上一层的长度就是队列的长度。
    • 注意,这里一定要将长度保存下来,然后用fori遍历,因为我们会修改这个队列。
    • 还有就是剪枝了,这里如果这个bank的字符串我们用过了,则就需要标记一下,只有没有用过,我们才需要变成这个字符。并且还需要判断bank中有没有这个字符串,所以我们可以定义一个map,map的key是这个字符串,然后value是这个字符串的下标,然后定义一个vis数组,标记这个字符串是不是遍历过。
  • 技巧:这里既然是bfs,那么就需要用到队列了。

java代码

class Solution {
    public int minMutation(String start, String end, String[] bank) {
        StringBuilder startSB = new StringBuilder(start);
        StringBuilder endSB = new StringBuilder(end);
        Map map = new HashMap<>();
        int len = bank.length;
        boolean[] vis = new boolean[len];
        char[] chars = {'A', 'C', 'G', 'T'};


        for (int i = 0; i < len; i++) {
            map.put(bank[i], i);
        }
        Queue queue = new LinkedList<>();
        queue.add(start);// 这个不用在vis中
        int ans = 0;
        while (!queue.isEmpty()) {
            // 要把这个队列中的内容都遍历完,才算是一层
            int queueSize = queue.size();// 这里一定要取出来,给一个变量
            for (int k = 0; k < queueSize; k++) {
                String poll = queue.poll();
                if (poll.equals(end)) {
                    return ans;
                }
                for (int i = 0; i < 8; i++) {// 位置
                    for (int j = 0; j < 4; j++) {// 字符
                        StringBuilder pollSB = new StringBuilder(poll);// 接下来对poll的第i位置进行转换
                        pollSB.setCharAt(i, chars[j]);
                        // 下面用到pollSB的String形式
                        String pollStr = pollSB.toString();
                        if (map.containsKey(pollStr) && !vis[map.get(pollStr)]) {
                            vis[map.get(pollStr)] = true;// 已经变成这个了
                            queue.add(pollStr);
                        }
                    }
                }
            }
            ans++;
        }
        return -1;
    }
}
  • 总结:题目比较有意思,主要是这里怎么找第几层,方法是通过保存queue的长度进行的,非常关键。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/866282.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号