加载中...

浙江理工大学入队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;
}
2.
点击查看代码
#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;
}

posted @ 2022-10-29 23:21  shany212  阅读(208)  评论(0编辑  收藏  举报