思路:
广度优先搜索
关键点:
- 如何把死亡数字转换成入队时的判断条件
- 如何获取下一组可以调整的数字(地位等同于广度搜索的下一层节点)
参考代码
public int openLock(String[] deadends, String target) {
//用来将数字转换为char的查询表
char[] pos = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
Set<String> set = new HashSet<>(Arrays.asList(deadends));
LinkedList<String> list = new LinkedList<>();
if (target == null || target.length() == 0 || set.contains("0000"))
return -1;
list.add("0000");
int depth = 0;
//广度优先遍历
while (!list.isEmpty()) {
int size = list.size();
while (size-- > 0) {
String str = list.removeFirst();
if (str.equals(target)) {
return depth;
}
if (!set.contains(str)) {
set.add(str);
list.addAll(getNextList(str, pos));
}
}
//每一层遍历完,深度加一
depth++;
}
return -1;
}
private List<String> getNextList(String str, char[] pos) {
List<String> res = new ArrayList<>();
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
int num = chars[i] - '0';
char[] newChars = chars.clone();
newChars[i] = pos[(num + 11) % 10]; //数字加一
res.add(new String(newChars));
newChars[i] = pos[(num + 9) % 10]; //数字减一
res.add(new String(newChars));
}
return res;
}
网友评论