浙江理工大学入队200题——14O
问题 O: 零基础学C/C++160——字符串
题目描述
给定两个由小写字母组成的字符串A和B,判断B中的字符是否全部在A中出现。
输入
输入为多组测试数据。
输入数据只有一行,包含2个字符串A和B,每个字符串后面有一个#字符标记(#不属于A或B),其中B字符串不为空,两个字符串长度均不超过1000000。
输出
如果B中的字符全部在A中出现,输出Yes,否则输出No。
样例输入 Copy
abc#ab#
样例输出 Copy
Yes
题解 两种方法
==注意长度为1e6,数组不要开小了(你开1e5就会RE83%)
1.根据两个#分成两个区域,前面区域进行装桶(出现就变成1,因为不用求几个数,所以不用++),初始值为0,将26个字母对应到b[0]-b[25]之中。然后判断后面区域,若b[X]=0,那么标记一下flag,直接break准备输出;
2.使用strchr()函数
具体见>https://www.runoob.com/cprogramming/c-function-strchr.html<
代码(AC)有两种方法
1.
点击查看代码
#include<iostream>
#include<cstring>
using namespace std;
char a[1000010];
int main()
{
while(cin>>a)
{
int i,j,sum=0,flag3=-1;
int b[27]={0};
for(i=0;i<strlen(a);i++)
{
if(i>=26)
{
sum=0;
for(j=0;j<26;j++) sum+=b[j];
if(sum==26)
{
flag3=2;
break;
}
}
if(a[i]!='#') b[a[i]-'a']=1;
else break;
}
if(flag3==-1)
{
for(j=i+1;j<strlen(a)-1;j++)
{
if(b[a[j]-'a']!=1)
{
flag3=1;
break;
}
}
}
if(flag3==1) printf("No\n");
else printf("Yes\n");
}
return 0;
}
点击查看代码
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000000],b[1000000];
while(scanf("%s",a)!=EOF)
{
int i=0,j;
while(a[i]!='#')i++;
i++;
for(j=i;a[j]!='#';j++)
{
b[j-i]=a[j];
}
b[j-i]='\0';
a[i-1]='\0';
for(i=0;b[i]!='\0';i++)
{
if(strchr(a,b[i])==NULL)//查找不到
{
printf("No\n");
break;
}
}if(i==strlen(b))//已经查到最后了
{
printf("Yes\n");
}
}
return 0;
}
本文来自博客园,作者:shany212,转载请注明原文链接:https://www.cnblogs.com/codeshany/p/zstu_200_14O.html