leetcode433

21 篇文章 0 订阅
本文介绍了一种深度优先搜索(Depth-First Search, DFS)的算法模板,并通过一个具体的问题实例展示了如何使用DFS来寻找从起始状态到目标状态的最短路径。在示例中,我们从一个基因序列出发,通过改变序列中的一个字符,寻找到达另一个基因序列的最短步骤数。文章详细解释了DFS的实现过程,包括如何避免重复访问节点、如何递归地探索所有可能的路径以及如何更新最短路径长度。
摘要由CSDN通过智能技术生成

深度优先模板

/*
 * 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);
    			//当递归返回时。移走访问过的字符串,因为从该节点向下延伸的路径已经遍历完毕
    		}
    	}
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值