【问题描述】
在一个单词或者一个句子中,如果每个字母都至少出现过一次,则称为全字母短句。
输入若干句子,请判断这些句子是否为全字母短句。
【输入形式】
输入的第一行为T,表示有T个测试用例,接下来的T行,每行为一个句子。
【输出形式】输出有T行,每行对应一个测试用例的输出,如果该句子为全字母短句,输出"Yes",如果为不是全字母短句,则输出"No"以及所缺失的字母(大写,按字母序),以空格分隔。
#include<iostream> #include<string> #include<ctype.h> using namespace std; bool Find(string str,char i) { if(str.find(i)!=string::npos)//如果没找到,函数返回值是string::npos return 1; //注意string::npos不是普通整型 return 0; } int main(){ int t; cin>>t; while(t--) { cin.ignore();//清理缓冲区,不然会getline会把换行符读进去 string str; getline(cin,str); int a='A'; int flag[26]={}; int slen=str.size(); int cnt=0; char miss; for(int j=0;j<slen;j++) { str[j]=toupper(str[j]);//全部变为大写,方便后续的判断 } //string和数组还是有相似之处的,我才学习到字符串也可以利用下标 for(int i='A';i<='Z';i++) { if(Find(str,(char)i)) flag[i-a]++;//利用ASCII编码和下标法 } for(int k=0;k<26;k++) { if(flag[k]!=0) cnt++; } if(cnt==26)cout<<"Yes"<<endl; else { cout<<"No"<<' '; for(int k=0;k<26;k++) { if(flag[k]==0) { miss=(char)(a+k); cout<<miss<<' '; } if(k==25)cout<<"\n"; } } } }