http://ac.jobdu.com/problem.php?pid=1165 字符串匹配
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str[1005][500],temp[1005][500],pattern[1005];
inline bool pre_match(int j,int start,int end)
{
int i;
for(i=start;i<=end;i++)
{
if(temp[j][i]!=pattern[i])
return false;
}
return true;
}
inline bool middle_match(int j,int start,int end)
{
int i;
for(i=start+1;i<end;i++)
{
if(temp[j][start]==pattern[i])
return true;
}
return false;
}
inline bool post_match(int j,int start,int end)
{
int i,p;
for(i=start+1,p=end+1;temp[j][i]!='\0' && pattern[p]!='\0' ;i++,p++)
{
if(temp[j][i]!=pattern[p])
return false;
}
return true;
}
int main(void)
{
int i,j,n,st,en;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%s",str[i]);
strcpy(temp[i],str[i]);
}
for(i=0;i<n;i++)
{
for(j=0;temp[i][j]!='\0';j++)
{
if(temp[i][j]>='a') //将字符串中的字符全部转换为大写,数字则不变
temp[i][j]-=32;
}
}
scanf("%s",pattern);
st=en=-1;
for(i=0;pattern[i]!='\0';i++)
{
if(pattern[i]>='a')
pattern[i]-=32;
if(pattern[i]=='[')
st=i;
else if(pattern[i]==']')
en=i;
}
if(st==-1) //不存在中括号表示的模式匹配
{
for(i=0;i<n;i++)
{
if(strcmp(temp[i],pattern)==0)
{
printf("%d %s\n",i+1,str[i]);
break;
}
}
}
else
{
for(i=0;i<n;i++)
{
if(strlen(str[i]) != strlen(pattern) - (en - st) )
continue;
if(pre_match(i,0,st-1) && middle_match(i,st,en) && post_match(i,st,en)) //前缀、中间、后缀分别都匹配
{
printf("%d %s\n",i+1,str[i]);
}
}
}
}
return 0;
}
http://ac.jobdu.com/problem.php?pid=1168 字符串的查找删除
#include<iostream>
#include<cstdio>
using namespace std;
#include<string.h>
char str[1000][1000],s[1000];
int slen;
bool match(int j,int len,int index)
{
int i,p;
for(i=j,p=0;i<j+len && p<slen;i++,p++)
{
if(s[p]!=str[index][i])
{
if(s[p]-str[index][i]!=32 && str[index][i]-s[p]!=32) //大小写不敏感
return false;
}
}
return true;
}
int main(void)
{
int i,j,n=0,len;
//freopen("a.txt","w",stdout);
scanf("%s",s);
slen=strlen(s);
getchar();
while(gets(str[n]))
{
if(strcmp(str[n],"}")==0)
break;
n++;
}
for(i=0;i<=n;i++)
{
len=strlen(str[i]);
for(j=0;j<=len-slen;j++)
{
if(str[i][j]==' ')
continue;
if(!match(j,slen,i)) //不匹配的话直接输出
printf("%c",str[i][j]);
else //匹配的话直接跳过,不输出
j=j+slen-1;
}
for(;j<len;j++)
printf("%c",str[i][j]);
printf("\n");
}
return 0;
}