没有合适的资源?快使用搜索试试~ 我知道了~
正则匹配问题实现源代码,代码简单易懂,可以参考
资源推荐
资源详情
资源评论
//设当前考察的正则表达式为s,当前考察的文件为f。
//用match(i,j)表示s[1..i]与f[1..j]的匹配情况。
//当s[1..i]能匹配f[1..i]时,match(i,j)=1,否则match(i,j)=0。
#include<iostream>
#include<string>
using namespace std;
int maxmat; //最优正则表达式所能匹配的到操作文件数
int minlen; //最优正则表达式的长度
int currmat; //当前最优正则表达式所能匹配的操作文件数
char minmat[10];
char s[10];
int p[10];
struct cf
{
char c;
int f;
}cha[10][10];
int n[2];
string f[10]; //f[10]用来存储输入的文件名称
int match[10][10][10]; //match[len][i][j]表示s[1..lenth]与f[i][1..j]的匹配情况。
void save(char c,int len) //save对操作文件名中出现的字符按出现频率排序储存,以加快搜索进程
{
for(int i=1;i<=p[len];i++) //p[i]表示操作文件名中出现的不同的字符的个数
if(cha[len][i].c==c) //cha[len][i]表示当前考察的正则表达式长度为len时,操作文件名字出现频率第i高的字符。
{
cha[len][i].f++;
cha[len][0]=cha[len][i];
//用match(i,j)表示s[1..i]与f[1..j]的匹配情况。
//当s[1..i]能匹配f[1..i]时,match(i,j)=1,否则match(i,j)=0。
#include<iostream>
#include<string>
using namespace std;
int maxmat; //最优正则表达式所能匹配的到操作文件数
int minlen; //最优正则表达式的长度
int currmat; //当前最优正则表达式所能匹配的操作文件数
char minmat[10];
char s[10];
int p[10];
struct cf
{
char c;
int f;
}cha[10][10];
int n[2];
string f[10]; //f[10]用来存储输入的文件名称
int match[10][10][10]; //match[len][i][j]表示s[1..lenth]与f[i][1..j]的匹配情况。
void save(char c,int len) //save对操作文件名中出现的字符按出现频率排序储存,以加快搜索进程
{
for(int i=1;i<=p[len];i++) //p[i]表示操作文件名中出现的不同的字符的个数
if(cha[len][i].c==c) //cha[len][i]表示当前考察的正则表达式长度为len时,操作文件名字出现频率第i高的字符。
{
cha[len][i].f++;
cha[len][0]=cha[len][i];
int j=i;
while(cha[len][j-1].f<cha[len][0].f)
{
cha[len][j]=cha[len][j-1];
j--;
}
cha[len][j]=cha[len][0];
return;
}
cha[len][++p[len]].c=c;
cha[len][p[len]].f=1;
}
bool check(int len) //计算当前匹配情况,这里使用动态规划
{
int i,j,t,k=0;
currmat=0;
for(i=1;i<=n[0];i++)
{
memset(&match[len][i],0,sizeof(match[len][i])); //m[len][i]数组全部赋初值0
if(len==1&&s[1]=='*')
match[len][i][0]=1;
for(j=1;j<=f[i].length();j++) //第i个f[i]文件名称的长度
switch(s[len]){
case'*': //如果s[len]为'*',即当前正则表达式最后一个字符是'*'
for(t=0;t<=j;t++)
if(match[len-1][i][t]==1)
{
while(cha[len][j-1].f<cha[len][0].f)
{
cha[len][j]=cha[len][j-1];
j--;
}
cha[len][j]=cha[len][0];
return;
}
cha[len][++p[len]].c=c;
cha[len][p[len]].f=1;
}
bool check(int len) //计算当前匹配情况,这里使用动态规划
{
int i,j,t,k=0;
currmat=0;
for(i=1;i<=n[0];i++)
{
memset(&match[len][i],0,sizeof(match[len][i])); //m[len][i]数组全部赋初值0
if(len==1&&s[1]=='*')
match[len][i][0]=1;
for(j=1;j<=f[i].length();j++) //第i个f[i]文件名称的长度
switch(s[len]){
case'*': //如果s[len]为'*',即当前正则表达式最后一个字符是'*'
for(t=0;t<=j;t++)
if(match[len-1][i][t]==1)
{
剩余6页未读,继续阅读
资源评论
jz199479
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功