2022.5.7-----leetcode.433

本文介绍了一种通过深度优先搜索(DFS)算法解决基因序列在指定银行中通过最少次数变异从起始到目标字符串的问题。核心内容涉及构建路径、计数变异、标记已访问节点及回溯过程。
      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;
       
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值