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]; //存储临