题目描述
给一个字符串,请判断字符串是否出现了所有的英文字母(不区分大小写)。
输入
每行一个只含英文字母的字符串,长度不超过1000。
输出
每行输出一个样例的结果,如果出现了所有的字符串,输出“Yes”,否则输出“No”。(不需要输出引号)
样例输入
ProgrammingPratice TheQuickBrownFoxJumpsOverLazyDog样例输出
No Yes
解题思路:
我们需要用一个标志来记录英文字母是否出现过,较简单的方法是利用 数组 来作为标志 载体。
定义一个 整数类型的数组 book[], book[1] == 0,表示 字母 A(a) 未出现过, book[2] == 0,表示 字母 B(b) 未出现过,以此类推。
然后思考 如何把输入的 字母 转换成 整数类型数组的下标 数字 。
要知道,计算机中的存储字符时 都是用 二进制表示的,如数字 0-9,字母 a-z,符号~!@ 等等都是。而这些字符统一采用 ASCII 编码。每个 字符都有一个对应的 ASCII码。我们就在这里做文章。
代码第 15行: t = Eword[i] - 'a' + 1; 是 等式右边:Eword[i] - 'a' 它们的ASCII码相减,然后加上 数字 1。注意等式这里是 数字 1,而不是 字符 '1'。 如果是字符 '1',则也是用ASCII码的值进行运算。 等式右边的值然后赋给左边的 t (整数类型)。 这个 t 就是数字,可以表示数组的下标了。这样就完成了 字符到数字 之间的关系转换。
代码中用到了一个 strlen()函数,在头文件 #include <string.h>中,请自行了解。
AC代码:
#include <stdio.h>
#include <string.h>
int main()
{
char Eword[1010];
while (scanf("%s",Eword) != EOF)
{
int book[30] = {0}; // 标志数组,需要初始化
int len,cnt,t;
len = strlen(Eword), cnt = 0; // strlen()函数
for (int i = 0; i < len; i ++)
{
if (Eword[i] >= 'a')
t = Eword[i] - 'a' + 1;
else
t = Eword[i] - 'A' + 1;
if (book[t] == 0)
{
cnt ++;
book[t] ++;
}
}
if (cnt == 26)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}