【4.3蓝桥备战】小朋友崇拜圈、正则问题

文章介绍了如何使用深度优先遍历(DFS)解决两个问题:一是分析小朋友崇拜圈中是否存在崇拜环,二是计算正则表达式中最长的正则片段。在崇拜圈问题中,DFS用于查找崇拜环;在正则问题中,DFS配合栈来处理括号结构并找出最长的正则串。
摘要由CSDN通过智能技术生成

小朋友崇拜圈

  • 小朋友崇拜圈 - 蓝桥云课 (lanqiao.cn)
    拿到这道题要先把题目读懂。
    下面的一行是表示:编号为i的小朋友,崇拜的对象为编号为path[i]的小朋友。
    本题应该使用DFS,深度优先遍历找到可以成环的崇拜圈。

如果用通俗的话来说,就是:

  • 每次传入小朋友最崇拜的人和自己,如果找不到,就继续找他崇拜的人所崇拜的人。(刚开始传入path[i](x),后来传入path[x])。
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    static int N;
    // 第i个小朋友最崇拜的人就是path[i]。
    static int []  path;
    static int ans;
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        N = s.nextInt();
        path = new int [N + 1];
        for(int i = 1 ; i <= N ; i ++){
            path[i] = s.nextInt();
        }
        for(int i = 1 ; i <= N ; i ++){
          //每次传入当前小朋友和他最崇拜的人,
            dfs(path[i],i,1);
        }
        System.out.println(ans);
    }

    /**
     *
     * @param x 被 i 崇拜的小朋友
     * @param ll 最找DFS要找回这个小朋友
     * @param cnt 返回圈数答案
     */
    static void dfs(int x,int ll , int cnt){
        if(cnt > N) return ;
        //
        if(x == ll){
            ans = Math.max(ans , cnt);
            return;
        }
        dfs(path[x],ll,cnt + 1);
    }
}

正则问题

  1. 遇到左括号进入DFS递归栈。
  2. 遇到右括号退出DFS递归。但是返回的结果要加入current,继续统计当前正则串长度。
  3. 遇到 | 就比较current和max最大的一方即可。

最后返回结果时,也要比较一次current和max,因为可能最后一次current没有被统计。

DFS函数定义:计算当前() 中的最长正则串。

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    static String str;
    static char [] ch;
    static int idx  = -1;

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        str = s.nextLine();
        ch = str.toCharArray();
        System.out.println(dfs());
    }
    static int dfs(){
        int current = 0;
        int max = 0;
        while(idx < ch.length - 1){
            idx ++;
            if(ch[idx] == '('){
                current += dfs();
            }else if(ch[idx] == 'x'){
                current ++;
            }else if(ch[idx] == '|'){
                max = Math.max(current , max);
                current = 0;
            }else{
                break;
            }
        }
        return Math.max(max , current);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sivan_Xin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值