搜索(三)

433.最小基因变化

class Solution433 {
    
    static char[] chars = {'A', 'C', 'G', 'T'};

    public static int minMutation(String start, String end, String[] bank) {
        Queue<String> queue = new LinkedList<>();
        queue.add(start);

        Set<String> set = new HashSet<>();
        Set<String> visited = new HashSet<>();
        visited.add(start);
        for (String s : bank) {
            set.add(s);
        }
        int step = 0;

        while (!queue.isEmpty()) {
            int size = queue.size();

            while (size-- != 0) {
                String cur = queue.poll();
                if (cur.equals(end))
                    return step;
                for (int i = 0; i < cur.length(); i++) {
                    StringBuilder stringBuilder = new StringBuilder(cur);
                    for (int j = 0; j < chars.length; j++) {
                        stringBuilder.setCharAt(i, chars[j]);
                        if (set.contains(stringBuilder.toString()) && !visited.contains(stringBuilder.toString())) {
                            queue.offer(stringBuilder.toString());
                            visited.add(stringBuilder.toString());
                        }

                    }
                }
            }

            step++;
        }

        return -1;
    }
}

127.单词接龙

class Solution127 {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {

        Queue<String> queue = new LinkedList<>();
        queue.offer(beginWord);
        Set<String> visited = new HashSet<>();
        visited.add(beginWord);
        Set<String> dict = new HashSet<>();
        for (String s : wordList) {
            dict.add(s);
        }
        int step = 1;

        while (!queue.isEmpty()) {
            int size = queue.size();

            while (size-- != 0) {
                String curWord = queue.poll();
                if (curWord.equals(endWord)) {
                    return step;
                }

                for (int i = 0; i < curWord.length(); i++) {
                    StringBuilder stringBuilder = new StringBuilder(curWord);
                    for (char ch = 'a'; ch <= 'z'; ++ch) {
                        stringBuilder.setCharAt(i, ch);
                        String changeWord = stringBuilder.toString();
                        if (dict.contains(changeWord) && !visited.contains(changeWord)) {
                            queue.offer(changeWord);
                            visited.add(changeWord);
                        }
                    }
                }

            }
            step++;
        }

        return 0;
    }
}

752. 打开转盘锁

class Solution752 {

    public int openLock(String[] deadends, String target) {
        Set<String> deadEnds = new HashSet<>();
        for (String s : deadends) {
            deadEnds.add(s);
        }

        if (deadEnds.contains("0000"))
            return -1;
        Set<String> visited = new HashSet<>();

        Queue<String> queue = new LinkedList<>();
        queue.offer("0000");
        visited.add("0000");
        int step = 0;
        while (!queue.isEmpty()) {
            int size = queue.size();
            while (size-- != 0) {
                String curWord = queue.poll();
                if (curWord.equals(target))
                    return step;
                for (int i = 0; i < curWord.length(); i++) {
                    StringBuilder tmp1 = new StringBuilder(curWord);
                    StringBuilder tmp2 = new StringBuilder(curWord);
                    char tmp1Ch = curWord.charAt(i);
                    tmp1Ch = tmp1Ch == '0' ? '9' : --tmp1Ch;
                    char tmp2Ch = curWord.charAt(i);
                    tmp2Ch = tmp2Ch == '9' ? '0' : ++tmp2Ch;
                    //判断是否在死亡数组中

                    tmp1.setCharAt(i, tmp1Ch);
                    tmp2.setCharAt(i, tmp2Ch);
                    if (!deadEnds.contains(tmp1.toString()) && !visited.contains(tmp1.toString())) {
                        queue.add(tmp1.toString());
                        visited.add(tmp1.toString());
                    }
                    if (!deadEnds.contains(tmp2.toString()) && !visited.contains(tmp2.toString())) {
                        queue.add(tmp2.toString());
                        visited.add(tmp2.toString());
                    }
                }
            }
            step++;
        }
        return -1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值