int min=9;//最少次数
boolean[] mark;//是否访问
Deque<String> s;//记录路径上的基因
void dfs(List<String> l1,List<String> l2){
//当到达l1中的某个字符串时,再变化一步即可成功
if(l1.contains(s.getLast())){
min=Math.min(min,s.size());
return;
}
for(int i=0;i<l2.size();i++){
if(!mark[i]){
int cnt=0;
for(int j=0;j<8;j++){
if(l2.get(i).charAt(j)!=s.getLast().charAt(j))
cnt++;
}
if(cnt==1){
s.add(l2.get(i));
mark[i]=true;
dfs(l1,l2);
s.pollLast();
mark[i]=false;
}
}
}
}
public int minMutation(String start, String end, String[] bank) {
int n=bank.length;
List<String> l1=new ArrayList<>();//与开始差一个字符的字符串
List<String> l2=new ArrayList<>();//剩下字符串
boolean flag=false;//是否包含结束字符串
for(int i=0;i<n;i++){
if(!bank[i].equals(start)){
int cnt=0;
for(int j=0;j<8;j++){
if(bank[i].charAt(j)!=start.charAt(j))
cnt++;
}
if(cnt==1)
l1.add(bank[i]);
if(!bank[i].equals(end))
l2.add(bank[i]);
else flag=true;
}
}
if(l1.isEmpty())
return -1;
s=new ArrayDeque<>();
s.add(end);//以end为根反向搜索
mark=new boolean[l2.size()];
dfs(l1,l2);
if(min==9) return -1;//达不到
if(!flag) return -1;//没有结束字符串
return min;
}