原题链接在这里:https://leetcode.com/problems/open-the-lock/

题目:

You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'. The wheels can rotate freely and wrap around: for example we can turn '9' to be '0', or '0' to be '9'. Each move consists of turning one wheel one slot.

The lock initially starts at '0000', a string representing the state of the 4 wheels.

You are given a list of deadends dead ends, meaning if the lock displays any of these codes, the wheels of the lock will stop turning and you will be unable to open it.

Given a target representing the value of the wheels that will unlock the lock, return the minimum total number of turns required to open the lock, or -1 if it is impossible.

Example 1:

Input: deadends = ["0201","0101","0102","1212","2002"], target = "0202"
Output: 6
Explanation:
A sequence of valid moves would be "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202".
Note that a sequence like "0000" -> "0001" -> "0002" -> "0102" -> "0202" would be invalid,
because the wheels of the lock become stuck after the display becomes the dead end "0102".

Example 2:

Input: deadends = ["8888"], target = "0009"
Output: 1
Explanation:
We can turn the last wheel in reverse to move from "0000" -> "0009".

Example 3:

Input: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"
Output: -1
Explanation:
We can't reach the target without getting stuck.

Example 4:

Input: deadends = ["0000"], target = "8888"
Output: -1

Note:

  1. The length of deadends will be in the range [1, 500].
  2. target will not be in the list deadends.
  3. Every string in deadends and the string target will be a string of 4 digits from the 10,000 possibilities '0000' to '9999'.

题解:

If the deadends include begin or target string, then it could never reach target, return -1.

Otherwise, use BFS to iterate from "0000".

Every time, we poll and get the current. For each char in current, plus or minus 1, have the new candidate, if the caidiate is not visited or not in the deadend, add it to the queue.

Time Complexity: O(V+E). V is node count. E is edge count.

Space: O(V).

AC Java:

 class Solution {
public int openLock(String[] deadends, String target) {
HashSet<String> hs = new HashSet<>(Arrays.asList(deadends));
if(hs.contains("0000") || hs.contains(target)){
return -1;
} LinkedList<Node> que = new LinkedList<>();
HashSet<String> visited = new HashSet<>();
visited.add("0000");
que.add(new Node("0000", 0));
while(!que.isEmpty()){
Node cur = que.poll();
if(cur.s.equals(target)){
return cur.num;
} String s = cur.s;
for(int i = 0; i<s.length(); i++){
char c = s.charAt(i);
String can1 = s.substring(0, i) + (c-'0'+1)%10 + s.substring(i+1);
if(!hs.contains(can1) && !visited.contains(can1)){
visited.add(can1);
que.add(new Node(can1, cur.num+1));
} String can2 = s.substring(0, i) + (c-'0'+10-1)%10 + s.substring(i+1);
if(!hs.contains(can2) && !visited.contains(can2)){
visited.add(can2);
que.add(new Node(can2, cur.num+1));
}
}
} return -1;
}
} class Node{
String s;
int num;
public Node(String s, int num){
this.s = s;
this.num = num;
}
}

Could use bidirectional BFS.

Time Complexity: O(V+E).

Space: O(V).

AC Java:

 class Solution {
public int openLock(String[] deadends, String target) {
HashSet<String> deadSet = new HashSet<>(Arrays.asList(deadends));
if(deadSet.contains("0000") || deadSet.contains(target)){
return -1;
} int level = 0;
HashSet<String> beginSet = new HashSet<>();
HashSet<String> endSet = new HashSet<>();
beginSet.add("0000");
endSet.add(target);
while(!beginSet.isEmpty() && !endSet.isEmpty()){
if(beginSet.size() > endSet.size()){
HashSet<String> temp = beginSet;
beginSet = endSet;
endSet = temp;
} HashSet<String> nextSet = new HashSet<>();
for(String s : beginSet){
if(endSet.contains(s)){
return level;
} for(int i = 0; i<s.length(); i++){
char c = s.charAt(i);
String can1 = s.substring(0, i) + (c-'0'+1)%10 + s.substring(i+1);
String can2 = s.substring(0, i) + (c-'0'+10-1)%10 + s.substring(i+1);
if(!deadSet.contains(can1)){
nextSet.add(can1);
} if(!deadSet.contains(can2)){
nextSet.add(can2);
}
}
} level++;
beginSet = nextSet;
} return -1;
}
}

跟上Word Ladder II.

LeetCode 752. Open the Lock的更多相关文章

  1. [LeetCode] 752. Open the Lock 开锁

    You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', '3', ...

  2. 【LeetCode】752. Open the Lock 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  3. LeetCode 752:打开转盘锁 Open the Lock

    题目: 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋转:例如把 ' ...

  4. [LeetCode] 0752. Open the Lock 打开转盘锁

    题目 You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', ' ...

  5. LC 752 Open the Lock

    由于这个问题,涉及了很多知识,例如数据结构里面的哈希表,c++中的迭代器,因此,需要对于每一个疑惑逐一击破. 问题描述 You have a lock in front of you with 4 c ...

  6. Java实现 LeetCode 752 打开转盘锁(暴力)

    752. 打开转盘锁 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋 ...

  7. Leetcode: Find Permutation(Unsolve lock problem)

    By now, you are given a secret signature consisting of character 'D' and 'I'. 'D' represents a decre ...

  8. leetcode 752. 打开转盘锁

    地址 https://leetcode-cn.com/problems/open-the-lock/ 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', ...

  9. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

随机推荐

  1. docker搭建MediaWiki

    一.简介 MediaWiki 是 Wikipedia 使用的网站解决方案的开源版,以个人观点来看,Wiki 在这个时代显得不够时尚,且不支持 MarkDown 等新兴的标记语言,另外页面的组织方式采用 ...

  2. Java学习:接口(interface)的使用于注意事项

    接口 接口就是一种公共的规范标准.只要符合规范标准,就可以大家通用. 接口就是多个类的公共规范.接口是一种引用数据类型,最重要的内容就是其中的:抽象方法. 如何定义一个接口的格式 如何定义一个接口的格 ...

  3. SAP T CODE : Description (Program)

    SAP T CODE : Description (Program) V : Quickstart RKCOWUSL (RKCOWUSL)V+01 : Create Sales Call (SAPMV ...

  4. SQL Server的NTEXT类型不支持等号"="操作(转载)

    SQL SERVER – Fix: Error : 402 The data types ntext and varchar are incompatible in the equal to oper ...

  5. display:grid

    使用grid布局 参考资料http://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html flex布局还没完全用利索,但这个grid布 ...

  6. CMPP服务端源码

    CMPP服务端,带数据库,可以接收第三方CMPP客户端的短信,并存入数据库,结合我的cmpp客户端服务程序,将可以实现接收第三方SP的短信并转发到网关实现发送,并将状态报告.上行短信转发给第三方SP, ...

  7. Docker Cheatsheet

    一.创建 docker create:创建容器,处于停止状态. centos:latest:centos容器:最新版本(也可以指定具体的版本号).本地有就使用本地镜像,没有则从远程镜像库拉取.创建成功 ...

  8. Matplotlib中figure、subplot、axes、axis的区别

    参考链接:https://blog.csdn.net/JasonZhu_csdn/article/details/85860963 画图板/画布: 这是一个基础载体,类似实际的画图板,用pyplot. ...

  9. 使用 sql server 默认跟踪分析执行的 SQL 语句

    如果没有启用 SQL SERVER 的跟踪器来跟踪 SQL SERVER 的 SQL 执行情况,又想查最近的 SQL 执行情况,网上一般说是使用 LogExprorer 这个工具,网上找了这个工具很久 ...

  10. CSS揭秘-半透明边框与多重边框

    场景一: 实现半透明边框: 由于CSS样式的默认行为,背景色的渲染范围是 content+padding+border. 半透明边框被主调色影响, 实现的效果为   解决方案: 使用backgroun ...