public int openLock(String[] deadends, String target) {
Set<String> deads = new HashSet<>(Arrays.asList(deadends));
Set<String> begin = new HashSet<>();
Set<String> end = new HashSet<>();
while (!begin.isEmpty() && !end.isEmpty()) {
// Always start with a smaller set
if (begin.size() > end.size()) {
Set<String> temp = new HashSet<>();
for (String code : begin) {
if (deads.contains(code)) {
for (int i = 0; i < code.length(); i++) {
String nextCode1 = code.substring(0, i) + (c == '9' ? 0 : c - '0' + 1) + code.substring(i + 1);
String nextCode2 = code.substring(0, i) + (c == '0' ? 9 : c - '0' - 1) + code.substring(i + 1);
if (end.contains(nextCode1) || end.contains(nextCode2)) {
if (!deads.contains(nextCode1)) {
if (!deads.contains(nextCode2)) {