力扣每日一题:最小基因变化(BFS广度优先搜索)

 首先的,这个题要是懂BFS就非常简单,看一眼就会,

要是不会,给你一个链接,自己去看看

广度优先遍历、双向广度优先遍历(Java) - 单词接龙 - 力扣(LeetCode) (leetcode-cn.com)

我说一下思路:

1.定义一个队列,符合本题题意,先进先出

2.定义两个集合一个装检查过了的元素,一个是否包含指定元素,set、list都可以,只要有contnias检查元素方法都可以

具体解释在代码里:

class Solution {
    static char carr[] = { 'A', 'C', 'G', 'T' };
    public int minMutation(String a, String end, String[] arr) {
Queue duiLie = new LinkedList<>();
		duiLie.add(a);
		Set kuarr = new HashSet<>();
		for (int i = 0; i < arr.length; i++) {
			kuarr.add(arr[i]);
		}
		Set chak = new HashSet<>();
		chak.add(a);
		int ans = 0;
		int lan = a.length();
		while (!duiLie.isEmpty()) {
//队列为空就退出
			int size = duiLie.size();
			for (int i = 0; i < size; i++) {//循环队列元素
				String str = duiLie.poll();
				char[] chararr = str.toCharArray();
				for (int j = 0; j < lan; j++) {//开始变字母
					char t = chararr[j];
					for (int k = 0; k < 4; k++) {//指定元素,只有四个。创建一个静态字符数组装着用
						if (t == carr[k]) {//等于就跳过
							continue;
						}
						chararr[j] = carr[k];//改变字母
						String tstr = String.valueOf(chararr);//改变一次,转成字符串,进行比较
						if (kuarr.contains(tstr)) {//改变后是否在指定数组里面
							if (tstr.equals(end)) {//等于最终效果时退出,加上最终效果的个数
								return ans + 1;
							}
							if (!chak.contains(tstr)) {//没有对比过就进行对比,
								chak.add(tstr);//更新本次对比
								duiLie.add(tstr);//加入队列
							}
						}
					}
					chararr[j] = t;//换回元素,为下一次做准备
				}
			}
			ans++;//次数加一,因为只要队列不为空,元素肯定包含,既然加入了队列,肯定是在指定元素里数组
		}
		return -1;
		
    }
}

你可能感兴趣的:(基础算法,leetcode,宽度优先,散列表)