对于两个字符串之间的匹配:
二分匹配实在看不懂,我自己的办法是设两个数组,用于标记字符串中'a'-'z'的个数,然后比较两个数组时候一致,一致则匹配
TOJ 1856. Anagrammatic Distance
统计两个字符串中字符的差异数
Code
#include<iostream>
using namespace std;
int main()
{
int test,i,j=1,k,dis,p1[27],p2[27];
char s1[50],s2[50];
cin>>test;
cin.getline(s1,50);
while(test--)
{
cin.getline(s1,50);
cin.getline(s2,50);
dis=0;
memset(p1,0,sizeof(p1));
memset(p2,0,sizeof(p2));
for(i=0;i<strlen(s1);i++)
{k=s1[i]-'a';p1[k]++;}
for(i=0;i<strlen(s2);i++)
{k=s2[i]-'a';p2[k]++;}
for(i=0;i<26;i++)
dis+=abs(p1[i]-p2[i]);
cout<<"Case #"<<j++<<": ";
cout<<dis<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int test,i,j=1,k,dis,p1[27],p2[27];
char s1[50],s2[50];
cin>>test;
cin.getline(s1,50);
while(test--)
{
cin.getline(s1,50);
cin.getline(s2,50);
dis=0;
memset(p1,0,sizeof(p1));
memset(p2,0,sizeof(p2));
for(i=0;i<strlen(s1);i++)
{k=s1[i]-'a';p1[k]++;}
for(i=0;i<strlen(s2);i++)
{k=s2[i]-'a';p2[k]++;}
for(i=0;i<26;i++)
dis+=abs(p1[i]-p2[i]);
cout<<"Case #"<<j++<<": ";
cout<<dis<<endl;
}
return 0;
}
统计字符串中各字符的数量
Code
#include<iostream>
using namespace std;
int main()
{
char text[101],e;
int test,i,k,len,count[26],max;
cin>>test;
while(test--)
{
memset(count,0,sizeof(count));
cin>>text;
len=strlen(text);
for(i=0;i<len;i++)
{
k=text[i]-'a';
count[k]++;
}
max=0;
for(i=0;i<26;i++)
if(count[i]>max) max=count[i];
for(i=0;i<26;i++)
if(count[i]==max)
{ e='a'+i;cout<<e;}
cout<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
int main()
{
char text[101],e;
int test,i,k,len,count[26],max;
cin>>test;
while(test--)
{
memset(count,0,sizeof(count));
cin>>text;
len=strlen(text);
for(i=0;i<len;i++)
{
k=text[i]-'a';
count[k]++;
}
max=0;
for(i=0;i<26;i++)
if(count[i]>max) max=count[i];
for(i=0;i<26;i++)
if(count[i]==max)
{ e='a'+i;cout<<e;}
cout<<endl;
}
return 0;
}
此题极度纠结,输入麻烦,匹配也麻烦,写了半天仍然WA
后来Roba大牛告诉我“这个程序很怪,我把它拿到TOJ上去测,结果都是对的。不知道为什么交上去就是WA... ”
囧
Code
#include<iostream>
using namespace std;
int i,j,p,q,n,k,t,o;
char s[100];
char l[30];
char m[100][30];
int p1[26],p2[26];
void convert(char l[21],int i)
{
if(i==2)
{
int find=0;
for(p=0;p<k&&find==0;p++)
{
if(l[0]==m[p][0]&&l[1]==m[p][1])
{printf("%s",m[p]);find=1;break;}
}
}
else{
int find=0;
for(p=0;p<k&&find==0;p++)
{
o=0;
if(strlen(m[p])==i)
{
if(l[0]==m[p][0]&&l[i-1]==m[p][i-1])
{
memset(p1,0,sizeof(p1));
memset(p2,0,sizeof(p2));
for(q=1;q<i-1;q++)
{t=m[p][q]-'a';p1[t]++;}
for(q=1;q<i-1;q++)
{t=l[q]-'a';p2[t]++;}
for(;o<26;o++)
if(p1[o]!=p2[o])
break;
}
}
if(o==26)
{printf("%s",m[p]);find=1;}
}
}
}
int main()
{
cin>>n;
k=n;
i=0;
while(n--)
{
cin>>m[i];
i++;
}
cin.getline(s,100);//纯粹为了输出格式
while(cin.getline(s,100))
{
i=0;j=0;
while(j<strlen(s))
{
if(s[j]==' ')
{j++;convert(l,i);cout<<' ';i=0;}
else
{
l[i++]=s[j++];
}
}
convert(l,i);
cout<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
int i,j,p,q,n,k,t,o;
char s[100];
char l[30];
char m[100][30];
int p1[26],p2[26];
void convert(char l[21],int i)
{
if(i==2)
{
int find=0;
for(p=0;p<k&&find==0;p++)
{
if(l[0]==m[p][0]&&l[1]==m[p][1])
{printf("%s",m[p]);find=1;break;}
}
}
else{
int find=0;
for(p=0;p<k&&find==0;p++)
{
o=0;
if(strlen(m[p])==i)
{
if(l[0]==m[p][0]&&l[i-1]==m[p][i-1])
{
memset(p1,0,sizeof(p1));
memset(p2,0,sizeof(p2));
for(q=1;q<i-1;q++)
{t=m[p][q]-'a';p1[t]++;}
for(q=1;q<i-1;q++)
{t=l[q]-'a';p2[t]++;}
for(;o<26;o++)
if(p1[o]!=p2[o])
break;
}
}
if(o==26)
{printf("%s",m[p]);find=1;}
}
}
}
int main()
{
cin>>n;
k=n;
i=0;
while(n--)
{
cin>>m[i];
i++;
}
cin.getline(s,100);//纯粹为了输出格式
while(cin.getline(s,100))
{
i=0;j=0;
while(j<strlen(s))
{
if(s[j]==' ')
{j++;convert(l,i);cout<<' ';i=0;}
else
{
l[i++]=s[j++];
}
}
convert(l,i);
cout<<endl;
}
return 0;
}
简单的字符串匹配,子序列
Code
#include<iostream>
#include<string>
using namespace std;
int main()
{
int t,i,j,d1,d2;
char s1[101],s2[101];
cin>>t;
while(t-->0)
{
cin>>s1>>s2;
i=0;j=0;d1=0;d2=0;
for(i=0;i<strlen(s1);i++)
{
if(s1[i]==s2[j])
j++;
if(j==strlen(s2))
break;
}
if(j==strlen(s2))
d1=1;
j=strlen(s2)-1;
for(i=0;i<strlen(s1);i++)
{
if(s1[i]==s2[j])
j--;
if(j==-1)
break;
}
if(j==-1)
d2=1;
if(d1==1||d2==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
#include<iostream>
#include<string>
using namespace std;
int main()
{
int t,i,j,d1,d2;
char s1[101],s2[101];
cin>>t;
while(t-->0)
{
cin>>s1>>s2;
i=0;j=0;d1=0;d2=0;
for(i=0;i<strlen(s1);i++)
{
if(s1[i]==s2[j])
j++;
if(j==strlen(s2))
break;
}
if(j==strlen(s2))
d1=1;
j=strlen(s2)-1;
for(i=0;i<strlen(s1);i++)
{
if(s1[i]==s2[j])
j--;
if(j==-1)
break;
}
if(j==-1)
d2=1;
if(d1==1||d2==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
TOJ 1911. Easier Done than Said?
简单地统计字符数,判断单词是否符合语法规则
Code
#include<iostream>
using namespace std;
int main()
{
char s[21];
int ac,i,v,c;
while(cin>>s&&strcmp(s,"end")!=0)
{
ac=0;v=0;c=0;
for(i=0;i<strlen(s);i++)
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
{
ac=1;
break;
}
if(ac==1)
{
for(i=0;i<strlen(s);i++)
{
if(i>0&&s[i]==s[i-1]&&s[i]!='e'&&s[i]!='o')
{
ac=0;
break;
}
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
{ v++;c=0;}
else
{ c++;v=0;}
if(v==3||c==3)
{ ac=0;break;}
}
}
if(ac==1)
cout<<"<"<<s<<"> is acceptable."<<endl;
else
cout<<"<"<<s<<"> is not acceptable."<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
int main()
{
char s[21];
int ac,i,v,c;
while(cin>>s&&strcmp(s,"end")!=0)
{
ac=0;v=0;c=0;
for(i=0;i<strlen(s);i++)
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
{
ac=1;
break;
}
if(ac==1)
{
for(i=0;i<strlen(s);i++)
{
if(i>0&&s[i]==s[i-1]&&s[i]!='e'&&s[i]!='o')
{
ac=0;
break;
}
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
{ v++;c=0;}
else
{ c++;v=0;}
if(v==3||c==3)
{ ac=0;break;}
}
}
if(ac==1)
cout<<"<"<<s<<"> is acceptable."<<endl;
else
cout<<"<"<<s<<"> is not acceptable."<<endl;
}
return 0;
}