题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1039
题目大意:给一个字符串,看是否符合密码的要求。
规则:
1.至少有1个元音字母。
2.不能有3个连续的元音字母或辅音字母
3.不能有相同的字母连续出现(除了ee,oo)
关键思想:耐心地处理字符串
代码如下:
//可优化 #include <iostream> #include <algorithm> #include <string.h> using namespace std; string t; bool isv(char a){ return a=='a'||a=='e'||a=='i'||a=='o'||a=='u'; } bool rule1(char *a){ return strchr(a,'a')!=NULL||strchr(a,'e')!=NULL||strchr(a,'i')||strchr(a,'o')||strchr(a,'u'); } bool rule(char *a){ int b[2]={0,0};//b[0]为连续元音数,b[1]为连续辅音数。 for(int i=0;i<t.size();i++){ if(isv(a[i]))b[0]++,b[1]=0; else b[1]++,b[0]=0; if(b[0]>=3||b[1]>=3)return false; if (i>0)if(a[i-1]==a[i]&&a[i]!='e'&&a[i]!='o'){ return false; } else { if(i+1<t.size()) if(a[i-1]==a[i]&&a[i]==a[i+1])return false; } } for(int i=1;i<t.size();i++){ } return true; } int main(){ while(cin>>t&&t!="end"){ char a[102]; memset(a,0,sizeof(a)); strncpy(a,t.c_str(),t.size());//因为后面用到函数要求char *,所以把字符串转化成字符数组。 if(rule1(a)&&rule(a)) cout<<"<"<<a<<"> is acceptable."<<endl; else cout<<"<"<<a<<"> is not acceptable."<<endl; } return 0; }