原题链接在这里: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. 小白的C++之路——求质数

    初学C++,打算用博客记录学习的足迹.写了两个求质数的程序,修修改改. #include <iostream> #include <math.h> using namespac ...

  2. Go语言系列教程(十二)之函数完结篇

    Hello,各位小伙伴大家好,我是小栈君.上一期我们讲到了关于函数的有参.无参.匿名函数,本期我们分享一下关于go语言函数类型.匿名函数和闭包的概念和实战.闲话不多说,立马开始分享. 在Go语言中,函 ...

  3. web开发-心路历程

    从事web开发已经有几年了,感触颇多,在此记录一下. 对于学习: 几年的经历让我认识到了,学习确实是一个持续永恒的过程.目前的社会发展很快,各种新的思想,新的机会不断刷新我的认知,也让我体会到了自己能 ...

  4. 关于mysql的null相关查询的一些坑

    我们先看一下效果,然后在解释,示例如下: mysql> create table test5 (a int not null,b int,c varchar(10)); Query OK, 0 ...

  5. DBA职业发展之路:去“IOE”等挑战之下,DBA将何去何从?

    DBA职业发展之路:去“IOE”等挑战之下,DBA将何去何从? 摘要:随着近些年来,开源.自动化.云化的兴起,DBA职业也正悄然发生一些变化.面对一系列新的挑战,DBA将如何进行职业发展?本文将给出一 ...

  6. Java Base64Utils

    Java Base64Utils /** * <html> * <body> * <P> Copyright 1994 JsonInternational</ ...

  7. MySql安装学习笔记

    参考地址:http://www.cnblogs.com/laumians-notes/p/9069498.html 该文章仅作为自己的学习笔记 一.准备mysql-8.0.11-winx64压缩包(示 ...

  8. .net core Identity注册用户 出错

    使用微软自带的注册 报 NotSupportedException: No IUserTwoFactorTokenProvider<TUser> named 'Default' is re ...

  9. win10环境变量PATH——路径添加

    我的电脑---->属性---->环境变量---->系统变量,选择path,点击“编辑”,“新建”,然后将路径添加上去即可

  10. Python中的单例设计

    01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 设计模式 是为了可重用代码.让代码更容易被他人理解.保 ...