深度优先模板
/* * dfs * 终止条件 * 访问当前节点 * 下探到下一层 * visted = set() * * def(node,visited): * if node in visited: * return * * visited.add(node) * * for next_node in node.children(): * if not next_node in visited: * dfs(next.node,visited) */
题意理解:从bank中找到一条最短的路径,这条路径通往end,路径上的每个节点都是上一个节点变换一个字母得来的
/* * 题意:在bank中找到从start到end的最短路径,每次变换一个元素 * 大佬的思路: * 1.遍历bank找出与当前节点相差一个字符的元素,作为下一层的开始 * 2.当当前元素到达end时,记录当前的路径长度(层数)和原来的路径值 * (初始化为Max)中的最小值 */ public class Main { static int minStepCount = Integer.MAX_VALUE; //记录最小路径值 public static void main(String[] args) { String start = "AACCGGTT"; String end = "AAACGGTA"; String[] bank = {"AACCGGTA", "AACCGCTA", "AAACGGTA"}; HashSet<String> hs = new HashSet(); //记录当前次循环中,是否遍历过该字符串,相当于visit数组的作用 fin(0,bank,end,start,hs); //遍历bank找路径 if(minStepCount != Integer.MAX_VALUE) System.out.println(minStepCount); else System.out.println("-1"); } public static void fin(int lev,String[] bank, String end,String cur,HashSet<String> v) { if(cur.equals(end)) //当当前路径可以到达end的时候,记录最短路径长度,lev层数表示当前的路径长度 minStepCount = Math.min(minStepCount, lev); for(String str : bank) { //遍历bank,寻找下一层的开始字符串,即与当前字符串只相差一个字符的字符串 int dif = 0;//记录两个字符串的距离 for(int i = 0;i < cur.length();i++) { if(cur.charAt(i) != str.charAt(i)) { if(++dif > 1) break;//如果当前字符串和bank中的字符串相差超过1,则直接break } } if(dif == 1 && !v.contains(str)) {//当当前字符串月遍历到的字符串相差为1个字符时 //还需要判断是否之前访问过该字符串,如果没有访问过,则添加到set中 v.add(str); fin(lev+1,bank,end,str,v);//以遍历到的字符串作为开始字符串进行递归,并且层数加一 v.remove(str); //当递归返回时。移走访问过的字符串,因为从该节点向下延伸的路径已经遍历完毕 } } } }