摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 失误原因(初次提交分数)
Spam-filter ★☆☆☆☆ 答案正确 100 2015-2-22 19:22:37 特殊情况(1)

(AC 1026)

题意

判断一个字符串是否是Email地址。一个Email地址格式满足:

显示/移除行号
  1. <letter> ::= a|b|...|z|A|B|...|Z
  2. <symbol> ::= <letter>|0|1|...|9|_|-
  3. <word> ::= <symbol>|<symbol><word>
  4. <prefix> ::= <word>|<prefix>.<word>
  5. <domain> ::= <letter><letter>|<letter><letter><letter>
  6. <suffix> ::= <prefix>.<domain>
  7. <address> ::= <prefix>@<suffix>

题解

按照题目要求一个个判断模拟即可,实现起来也不算太恶心。两点需要注意:

  1. 可能出现带空格的字符串,要用getline[1]
  2. 可能出现空Word,空Word不是Word,需要特判[2]

代码

274.cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include<cstdio>
  2. #include<string>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define si(n) scanf("%d",&n)
  7. #define ci const int &
  8. #define dsi(n) int n;si(n)
  9. #define f(i,n) for(int i=1;i<=n;++i)
  10. #define fi(i,p,n) for(int i=p;i<=n;++i)
  11. #define fd(i,n) for(int i=n;i!=0;--i)
  12. #define fdi(i,p,n) for(int i=n;i>=p;--i)
  13. #define ipt const string &s
  14. bool isSymbol(ipt)//<symbol> ::= <letter>|0|1|...|9|_|-////<letter> ::= a|b|...|z|A|B|...|Z//
  15. {
  16. if(s.size()>1)return 0;
  17. return isalnum(s[0])||s[0]=='_'||s[0]=='-';
  18. }
  19. bool isWord(ipt)//<word> ::= <symbol>|<symbol><word>//
  20. {
  21. if(!s.size())return 0;//fixed:空Word特判//
  22. if(isSymbol(s))return 1;
  23. string syb=s.substr(0,1),wd=s.substr(1);
  24. return isSymbol(syb)&&isWord(wd);
  25. }
  26. bool isPrefix(ipt)//<prefix> ::= <word>|<prefix>.<word>//
  27. {
  28. if(isWord(s))return 1;
  29. int t=s.rfind('.');
  30. if(t==string::npos)return 0;
  31. string pfx=s.substr(0,t),wd=s.substr(t+1);
  32. return isPrefix(pfx)&&isWord(wd);
  33. }
  34. bool isDomain(ipt)//<domain> ::= <letter><letter>|<letter><letter><letter>//
  35. {
  36. if(s.size()<2||s.size()>3)return 0;
  37. for(int i=0;i!=s.size();++i)
  38. if(!isalpha(s[i]))
  39. return 0;
  40. return 1;
  41. }
  42. bool isSuffix(ipt)//<suffix> ::= <prefix>.<domain>//
  43. {
  44. int t=s.rfind('.');
  45. if(t==string::npos)return 0;
  46. string pfx=s.substr(0,t),dmn=s.substr(t+1);
  47. return isPrefix(pfx)&&isDomain(dmn);
  48. }
  49. bool isEmail(ipt)//<address> ::= <prefix>@<suffix>//
  50. {
  51. int t=s.rfind('@');
  52. if(t==string::npos)return 0;
  53. string pfx=s.substr(0,t),sfx=s.substr(t+1);
  54. return isPrefix(pfx)&&isSuffix(sfx);
  55. }
  56. int main()
  57. {
  58. int n;
  59. scanf("%d\n",&n);
  60. while(n--)
  61. {
  62. string s;
  63. getline(cin,s);
  64. cout<<(isEmail(s)?"YES":"NO")<<endl;
  65. }
  66. return 0;
  67. }

参考资料和拓展阅读

  1. 跳转 http://www.cppblog.com/willing/archive/2010/05/11/115108.aspx?opt=admin
  2. 跳转 http://acm.sgu.ru/forum_action.php?id=3492

著作权声明[编辑]

关于[编辑]