leetcode 433. Minimum Genetic Mutation | 433. 最小基因变化(图的DFS)

妖狐艹你老母 2022-09-04 00:46 211阅读 0赞

题目

https://leetcode.com/problems/minimum-genetic-mutation/
在这里插入图片描述

题解

图的 DFS,思路见草稿:
在这里插入图片描述

  1. class Solution {
  2. int N;
  3. public int minMutation(String start, String end, String[] bank) {
  4. // 去重
  5. HashSet<String> set = new HashSet<>(Arrays.asList(bank));
  6. bank = set.toArray(new String[0]);
  7. N = bank.length;
  8. // init graph
  9. Map<String, Set<String>> map = new HashMap<>();
  10. for (int i = 0; i < N; i++) {
  11. if (!map.containsKey(bank[i])) {
  12. Set<String> i2j = new HashSet<>();
  13. map.put(bank[i], i2j);
  14. }
  15. for (int j = i + 1; j < N; j++) {
  16. if (!map.containsKey(bank[j])) {
  17. Set<String> j2i = new HashSet<>();
  18. map.put(bank[j], j2i);
  19. }
  20. if (mutate(bank[i], bank[j])) {
  21. map.get(bank[i]).add(bank[j]);
  22. map.get(bank[j]).add(bank[i]);
  23. }
  24. }
  25. }
  26. // dfs
  27. int min = Integer.MAX_VALUE;
  28. Set<String> visited = new HashSet<>();
  29. for (String s : bank) { // start并未在bank[]中出现
  30. if (mutate(start, s)) {
  31. visited.add(s);
  32. int distance = dfs(map, s, end, visited);
  33. if (distance > 0) min = Math.min(min, distance);
  34. visited.remove(s);
  35. }
  36. }
  37. return min == Integer.MAX_VALUE ? -1 : min;
  38. }
  39. // 当前start->end最短路径的长度
  40. public int dfs(Map<String, Set<String>> map, String start, String end, Set<String> visited) {
  41. if (visited.size() == N) return start.equals(end) ? N : -1; // (剪枝)已走完全部路径
  42. if (start.equals(end)) return visited.size();
  43. int min = Integer.MAX_VALUE;
  44. for (String k : map.get(start)) {
  45. if (!visited.contains(k)) {
  46. visited.add(k);
  47. int distance = dfs(map, k, end, visited);
  48. if (distance > 0) min = Math.min(min, distance);
  49. visited.remove(k);
  50. }
  51. }
  52. return min;
  53. }
  54. public boolean mutate(String s1, String s2) {
  55. int diff = 0;
  56. for (int i = 0; i < s1.length(); i++) {
  57. if (s1.charAt(i) != s2.charAt(i)) {
  58. if (++diff > 1) return false;
  59. }
  60. }
  61. return true;
  62. }
  63. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,211人围观)

还没有评论,来说两句吧...

相关阅读