From f66bd3caeda141b716b084202fdf6c8841e1420e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BD=A9=E8=BE=95=E9=BE=99=E5=84=BF?= Date: Fri, 7 Apr 2023 16:36:38 +0800 Subject: [PATCH] =?UTF-8?q?433:=E6=9C=80=E5=B0=8F=E5=9F=BA=E5=9B=A0?= =?UTF-8?q?=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../editor/cn/MinimumGeneticMutation.java | 106 ++++++++++++++++++ .../cn/doc/content/MinimumGeneticMutation.md | 50 +++++++++ 2 files changed, 156 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/MinimumGeneticMutation.java create mode 100644 src/main/java/leetcode/editor/cn/doc/content/MinimumGeneticMutation.md diff --git a/src/main/java/leetcode/editor/cn/MinimumGeneticMutation.java b/src/main/java/leetcode/editor/cn/MinimumGeneticMutation.java new file mode 100644 index 0000000..b7e638a --- /dev/null +++ b/src/main/java/leetcode/editor/cn/MinimumGeneticMutation.java @@ -0,0 +1,106 @@ +//

基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 'A''C''G''T' 之一。

+// +//

假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。

+// +// +// +//

另有一个基因库 bank 记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。(变化后的基因必须位于基因库 bank 中)

+// +//

给你两个基因序列 startend ,以及一个基因库 bank ,请你找出并返回能够使 start 变化为 end 所需的最少变化次数。如果无法完成此基因变化,返回 -1

+// +//

注意:起始基因序列 start 默认是有效的,但是它并不一定会出现在基因库中。

+// +//

 

+// +//

示例 1:

+// +//
+//输入:start = "AACCGGTT", end = "AACCGGTA", bank = ["AACCGGTA"]
+//输出:1
+//
+// +//

示例 2:

+// +//
+//输入:start = "AACCGGTT", end = "AAACGGTA", bank = ["AACCGGTA","AACCGCTA","AAACGGTA"]
+//输出:2
+//
+// +//

示例 3:

+// +//
+//输入:start = "AAAAACCC", end = "AACCCCCC", bank = ["AAAACCCC","AAACCCCC","AACCCCCC"]
+//输出:3
+//
+// +//

 

+// +//

提示:

+// +// +// +//
Related Topics
  • 广度优先搜索
  • 哈希表
  • 字符串

  • 👍 242
  • 👎 0
  • +package leetcode.editor.cn; + +import java.util.*; +import java.util.stream.Collectors; + +// 433:最小基因变化 +public class MinimumGeneticMutation { + public static void main(String[] args) { + Solution solution = new MinimumGeneticMutation().new Solution(); + // TO TEST + solution.minMutation("AACCGGTT","AAACGGTA",new String[]{"AACCGGTA","AACCGCTA","AAACGGTA"}); + } + + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int minMutation(String startGene, String endGene, String[] bank) { + List vist = Arrays.stream(bank).collect(Collectors.toList()); + if (!vist.contains(endGene)) { + return -1; + } + List use = new ArrayList<>(); + Queue queue = new LinkedList<>(); + queue.add(startGene); + use.add(startGene); + char[] chs = new char[]{'A', 'C', 'G', 'T'}; + int step = 1; + while (!queue.isEmpty()) { + int size = queue.size(); + for (int i = 0; i < size; i++) { + String str = queue.poll(); + for (int j = 0; j < 8; j++) { + for (int k = 0; k < 4; k++) { + if (chs[k] == str.charAt(j)) { + continue; + } + StringBuffer sb = new StringBuffer(str); + sb.setCharAt(j,chs[k]); + String tmp = sb.toString(); + if(tmp.equals(endGene)){ + return step; + } + if(vist.contains(tmp)&& !use.contains(tmp)){ + queue.add(tmp); + use.add(tmp); + } + } + } + } + step++; + } + return -1; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} diff --git a/src/main/java/leetcode/editor/cn/doc/content/MinimumGeneticMutation.md b/src/main/java/leetcode/editor/cn/doc/content/MinimumGeneticMutation.md new file mode 100644 index 0000000..6574810 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/doc/content/MinimumGeneticMutation.md @@ -0,0 +1,50 @@ +

    基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 'A''C''G''T' 之一。

    + +

    假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。

    + +
      +
    • 例如,"AACCGGTT" --> "AACCGGTA" 就是一次基因变化。
    • +
    + +

    另有一个基因库 bank 记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。(变化后的基因必须位于基因库 bank 中)

    + +

    给你两个基因序列 startend ,以及一个基因库 bank ,请你找出并返回能够使 start 变化为 end 所需的最少变化次数。如果无法完成此基因变化,返回 -1

    + +

    注意:起始基因序列 start 默认是有效的,但是它并不一定会出现在基因库中。

    + +

     

    + +

    示例 1:

    + +
    +输入:start = "AACCGGTT", end = "AACCGGTA", bank = ["AACCGGTA"]
    +输出:1
    +
    + +

    示例 2:

    + +
    +输入:start = "AACCGGTT", end = "AAACGGTA", bank = ["AACCGGTA","AACCGCTA","AAACGGTA"]
    +输出:2
    +
    + +

    示例 3:

    + +
    +输入:start = "AAAAACCC", end = "AACCCCCC", bank = ["AAAACCCC","AAACCCCC","AACCCCCC"]
    +输出:3
    +
    + +

     

    + +

    提示:

    + +
      +
    • start.length == 8
    • +
    • end.length == 8
    • +
    • 0 <= bank.length <= 10
    • +
    • bank[i].length == 8
    • +
    • startendbank[i] 仅由字符 ['A', 'C', 'G', 'T'] 组成
    • +
    + +
    Related Topics
  • 广度优先搜索
  • 哈希表
  • 字符串

  • 👍 242
  • 👎 0
  • \ No newline at end of file