[LeetCode] 752. Open the Lock

题:https://leetcode.com/problems/open-the-lock/

题目大意

有一个锁,上的有四个数,每个数可以循环转动从0-9,同时若锁上的数转为 deadends 中的元素时,锁会坏掉。每转一下,视为 一个 move,求将锁从 0000,转为 target的最小move。

思路

无向图的 搜索,使用 bfs,这里需要注意的是,对string的 任意位 改变 时,将 string 转化为 char[] 会更方便。

class Solution {
    public int openLock(String[] deadends, String target) {
        Queue<String> queue = new LinkedList();
        Set<String> deadendsSet = new HashSet();
        Set<String> hasVisitedSet = new HashSet();

        for(String deadend : deadends)
            deadendsSet.add(deadend);

        int moves = 0;
        String startLock = "0000";
        if(deadendsSet.contains(startLock))
            return -1;

        if(startLock.equals(target))
            return moves;

        hasVisitedSet.add(startLock);
        queue.add(startLock);
        int a =0;

        while(!queue.isEmpty()){
            int queueLen = queue.size();
            moves ++ ;
            while(queueLen-- > 0){
                char[] curChs = queue.poll().toCharArray();
                for(int i = 0 ; i < 4 ; i++){
                    int curVal = curChs[i] - '0';
                    curChs[i] = (char) ('0' +((curVal+10+1)%10));
                    String oneMoveString1 = new String(curChs);
                    curChs[i] = (char) ('0' +((curVal+10-1)%10));
                    String oneMoveString2 = new String(curChs);
                    curChs[i] = (char)(curVal + '0');

                    if(!hasVisitedSet.contains(oneMoveString1) && !deadendsSet.contains(oneMoveString1)){
                        if(oneMoveString1.equals(target))
                            return moves;
                        queue.add(oneMoveString1);
                        hasVisitedSet.add(oneMoveString1);
                    }
if(!hasVisitedSet.contains(oneMoveString2)&&!deadendsSet.contains(oneMoveString2)){
                        if(oneMoveString2.equals(target))
                            return moves;
                        queue.add(oneMoveString2);
                        hasVisitedSet.add(oneMoveString2);
                    }
                }
            }
        }
        return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值