算法设计与分析: 3-14 正则表达式匹配问题

该博客讨论了如何设计一个算法来解决正则表达式匹配问题,旨在找到能匹配最多‘+’标记的文件且不匹配任何‘-’标记的文件的最短正则表达式。输入包括文件名列表,每个文件名后跟随操作标志‘+’或‘-’。解决方案可能涉及动态规划,并参考了王晓东的《计算机算法设计与分析》。
摘要由CSDN通过智能技术生成

3-14 正则表达式匹配问题


问题描述

许多操作系统采用正则表达式实现文件匹配功能。一种简单的正则表达式由英文字母、数字及通配符“ * ”和“?”组成。“?”代表任意一个字符。“ * ”则可以代表任意多个字符。 现要用正则表达式对部分文件进行操作。

试设计一个算法,找出一个正则表达式,使其能匹配的待操作文件最多,但不能匹配任何不进行操作的文件。所找出的正则表达式的长度还应是最短的。

数据输入:
输入由 n(1≤n≤250)行组成。每行给出一个文件名。文件名由英文字母和数字组成。英文字符要区分大小写,文件名长度不超过 8 个字符。 文件名后是一个空格符和一个字符“+”或“-”。“+”表示要对该行给出的文件进行操作, “-”表示不进行操作。


Java

import java.util.Scanner;

class Cha{
    char c;  //字符
    int f;   //字符出现的频率
}

public class ZhengZeBiaoDaShiPiPei {
   

    /*
    正则表达式可选字符集的排列顺序先为‘*’,‘?’,操作文件名序列中出现的所有字符按其频率递减的次序随后
    大体思路:
    正则表达式为s,当前考察文件为f
    match(i, j)为s[1,i]与f[1,j]匹配情况
    如果match(i-1, j-1) = 1, s[i] = '?'
        match(i-1, j-1) = 1, s[i] = f[j]
        match(i-1, k) = 1,   s[i] = '*'
    match(i, j) = 1
    否则 match(i, j) = 0
    */

    private static int MAXN = 250;  //文件数
//    private static int MAXL = 8;  //文件名长度
    private static int MAXP = 62; //大写字母 + 小写字母 + 数字
    private static int minlen;  //最优正则表达式长度
    private static int maxmat;  //最优正则表达式所能匹配的操作文件数
    private static int curmat;  //当前正则式所能匹配的操作文件数
    private static String[] f = new String[MAXN+1];  //操作文件 + 非操作文件
    private static String[] k = new String[MAXN+1];  //非操作文件
    private static int[] n = new int[2];  //n[0]为操作文件数,n[1]为非操作文件数
    private static int[] p = new int[MAXP];  //p[len-1] 存储 s[len]可选字符数
    private static char[] s = new char[MAXP];  //存储临
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值