首先的,这个题要是懂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;
}
}