xtuoj complete string
题目
思路一
由于输入既有大小又有小写,然后题目说不区分大小写,一般小写通常比大小多,不妨把所有的大写都转换成小写。然后再统计是不是有字母没出现过,如果有,就可以立马判断No,如果循环结束都没判断为No,则输出Yes,这里我用一个flag来记录。
代码一
#include<stdio.h>
#include<string.h>
#include<ctype.h>char s[1005];int main(){while(~scanf("%s",s)){int len=strlen(s);int f[26]={0};for(int i=0;i<len;i++){if(isupper(s[i])) s[i]=tolower(s[i]);f[s[i]-'a']=1;}int flag=0;for(int i=0;i<26;i++){if(!f[i]){flag=1;break;}}if(flag) printf("No\n");else printf("Yes\n");}return 0;
}
思路二
不使用ctype.h函数,巧妙利用ASCII码小写与大写之间的关系,实现大小写的转换,这里要记住'a'是97,'A'是65,二者相差32,所以,将小写转换为大写,只要先判断是不是小写,是的话-32就可以变成大写,并且这里不用flag,而是采用cnt是不是26,cnt是种类数,先用一个bool数组,记录26个字母是否出现过,先都初始化为false,表示先没出现过,然后我们现在字母都转换为大写字母了,但是bool数组的索引是数组,所以我们将大写字母-65就可以得到对应索引了,如果对应bool数组为false,也就是没出现过,这是第一次出现,那我们就记录cnt++,然后标记对应字母出现过了,标记为true,最后判断字母个数是不是26个即可。
代码二
#include <stdio.h>
#include <string.h>
#include<stdbool.h>int main(){char str[1010] = {0};while (scanf("%s",str) != EOF){int cnt = 0;int len = strlen(str); // c库函数,求输入字符串(str)的长度bool books[26] = {false};for (int i = 0; i < len; i ++){if (str[i] >= 97) str[i] -= 32; // 小写转化为大写(ASCII码)if ( !books[str[i]-65]) cnt ++; // 如果该字母第一次出现,cnt++books[str[i]-65] = true; // 标记已出现的字母if (cnt == 26) break;}if (cnt == 26) puts("Yes");else puts("No");}return 0;
}