2021.05.11最小基因变化步数
(题目来源:https://leetcode-cn.com/problems/minimum-genetic-mutation/)
题目描述
一条基因依次可以发生一个基因突变,例如,基因序列由"AACCGGTT" 变化至 “AACCGGTA”
现在给定3个参数 — start, end, bank,分别代表起始基因序列,目标基因序列及基因库,请找出能够使起始基因序列变化为目标基因序列所需的最少变化次数。如果无法实现目标变化,请返回 -1。
思路
- dfs直接遍历,当然也可以用bfs遍历。
- dfs遍历时需要注意状态回溯。
代码
int res = Integer.MAX_VALUE;
String des;
String[] strs;
public int minMutation(String start, String end, String[] bank) {
des = end;
strs = bank;
dfs(start,0, new boolean[strs.length]);
return res == Integer.MAX_VALUE? -1: res;
}
public void dfs(String cur, int cnt, boolean[] vis) {
if(cnt >= res) return;
if(cur.contentEquals(des)) {
res = Math.min(res, cnt);
return;
}
for(int i = 0; i < strs.length; i++) {
if(!vis[i]) {
if(oneDif(cur,strs[i])) { //如果有一个不同
vis[i] = true;
dfs(strs[i], cnt+1, vis);
//尽管前面遍历过第i个String,并不意味着之后再遍历到第i个String时不会影响最后结果。
vis[i] = false; //要进行状态回溯
} else if(cur.contentEquals(strs[i])) vis[i] = true;
}
}
}
boolean oneDif(String A, String B) {
int cnt = 0;
for(int i = 0; i < A.length(); i++) {
if(A.charAt(i) != B.charAt(i)) cnt++;
}
return cnt==1;
}