Another BFS solvable problem of LeetCode!
Problem Description: https://leetcode.com/problems/open-the-lock/
Problem Approach: BFS
Time Complexity: O(1) as the custom size of state-nodes in this problem is a constant.
Solution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | //public class OpenTheLock { //} import java.util.*; class State { String code; int dist; State(String code, int dist) { this.code = code; this.dist = dist; } } class Solution { public int openLock(String[] deadends, String target) { Set<String> visited = new HashSet<>(); Set<String> deadendsSet = new HashSet<>(); for (String d : deadends) { deadendsSet.add(d); } if ("0000".equals(target)) return 0; if (deadendsSet.contains("0000")) return -1; Queue<State> q = new LinkedList<>(); q.add(new State("0000", 0)); visited.add("0000"); while (!q.isEmpty()) { State out = q.remove(); List<String> neighbours = getNeighbours(out.code); for (String n : neighbours) { if (!visited.contains(n) && !deadendsSet.contains(n)) { if (n.equals(target)) return out.dist+1; State neighState = new State(n, out.dist+1); visited.add(n); q.add(neighState); } } } return -1; } private List<String> getNeighbours(String baseState) { List<String> res = new ArrayList<>(); char[] codeChar = baseState.toCharArray(); for (int i=0; i<codeChar.length; i++) { String neighState = new String(); String c = ((codeChar[i]-'0')+1)%10 + ""; for (int idx=0; idx<codeChar.length; idx++) if (idx == i) neighState+=c; else neighState+=codeChar[idx]; res.add(neighState); neighState = new String(); c = ((codeChar[i]-'0')+10-1)%10 + ""; for (int idx=0; idx<codeChar.length; idx++) if (idx == i) neighState+=c; else neighState+=codeChar[idx]; res.add(neighState); } return res; } } |
Have fun, until next time!