Как сказал @Tarun, вы можете сохранить отношения ребенка с родителем. Есть лучший способ, которым я воспользовался, но сначала я собираюсь рассказать о том, какие у вас другие проблемы. Во-первых, вы делаете это: Set<String> visited = new HashSet<>(Arrays.asList(deadends));
Arrays.asList(...)
в вашем случае должно принимать каждый String
в deadends
. Итак, вы должны изменить это на следующее:
HashSet<String> set = new HashSet<>();
for(String s : deadends) {
set.add(s);
}
Конечно, переименуйте его в visited
, я просто копирую и вставляю материал из моего принятого решения. Кроме того, то, как вы используете Queue
, не является неправильным, но если вы берете все из него сразу, а затем добавляете новые значения, вы также можете использовать LinkedList
или ArrayList
. Вы должны получать записи из Queue
одну за другой, а Queue
помещает новые записи позже, так что вам не нужно беспокоиться о пропуске.
Лучший метод для отслеживания количество сделанных вами ходов хранится в самом Queue
. Вы сохраняете текущую комбинацию и количество шагов, предпринятых для ее достижения. Итак, когда вы найдете ответ, просто верните вторую запись, количество шагов. Если вы выйдете из l oop, верните -1. Вот мое принятое решение, использующее все это:
class Solution {
public int openLock(String[] deadends, String target) {
HashSet<String> set = new HashSet<>();
for(String s : deadends) {
set.add(s);
}
HashSet<String> visited = new HashSet<>();
Queue<Pair<String, Integer>> queue = new LinkedList<>();
queue.offer(new Pair<>("0000", 0));
while(!queue.isEmpty()) {
Pair<String, Integer> curr = queue.poll();
if(set.contains(curr.first) || !visited.add(curr.first)) {
continue;
} else if(curr.first.equals(target)) {
return curr.second;
} else {
LinkedList<String> next = next(curr.first);
for(String s : next) {
queue.offer(new Pair<>(s, curr.second + 1));
}
}
}
return -1;
}
private LinkedList<String> next(String string) {
LinkedList<String> ans = new LinkedList<>();
ans.add(String.valueOf(new char[]{minus(string.charAt(0)), string.charAt(1), string.charAt(2), string.charAt(3)}));
ans.add(String.valueOf(new char[]{plus(string.charAt(0)), string.charAt(1), string.charAt(2), string.charAt(3)}));
ans.add(String.valueOf(new char[]{string.charAt(0), minus(string.charAt(1)), string.charAt(2), string.charAt(3)}));
ans.add(String.valueOf(new char[]{string.charAt(0), plus(string.charAt(1)), string.charAt(2), string.charAt(3)}));
ans.add(String.valueOf(new char[]{string.charAt(0), string.charAt(1), minus(string.charAt(2)), string.charAt(3)}));
ans.add(String.valueOf(new char[]{string.charAt(0), string.charAt(1), plus(string.charAt(2)), string.charAt(3)}));
ans.add(String.valueOf(new char[]{string.charAt(0), string.charAt(1), string.charAt(2), minus(string.charAt(3))}));
ans.add(String.valueOf(new char[]{string.charAt(0), string.charAt(1), string.charAt(2), plus(string.charAt(3))}));
return ans;
}
private char minus(char c) {
return c == '0' ? '9' : (char) ((int) c - 1);
}
private char plus(char c) {
return c == '9' ? '0' : (char) ((int) c + 1);
}
private class Pair<E, T> {
E first;
T second;
Pair(E e, T t) {
first = e;
second = t;
}
}
}