摘要

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

(AC 1026)

题意

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

   <letter> ::= a|b|...|z|A|B|...|Z
   <symbol> ::= <letter>|0|1|...|9|_|-
   <word> ::= <symbol>|<symbol><word>
   <prefix> ::= <word>|<prefix>.<word>
   <domain> ::= <letter><letter>|<letter><letter><letter>
   <suffix> ::= <prefix>.<domain>
   <address> ::= <prefix>@<suffix>

题解

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

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

代码

274.cpp代码已折叠
展开折叠内容
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define si(n) scanf("%d",&n)
#define ci const int &
#define dsi(n) int n;si(n)
#define f(i,n) for(int i=1;i<=n;++i)
#define fi(i,p,n) for(int i=p;i<=n;++i)
#define fd(i,n) for(int i=n;i!=0;--i)
#define fdi(i,p,n) for(int i=n;i>=p;--i)
#define ipt const string &s
bool isSymbol(ipt)//<symbol> ::= <letter>|0|1|...|9|_|-////<letter> ::= a|b|...|z|A|B|...|Z//
{
    if(s.size()>1)return 0;
    return isalnum(s[0])||s[0]=='_'||s[0]=='-';
}
bool isWord(ipt)//<word> ::= <symbol>|<symbol><word>//
{
    if(!s.size())return 0;//fixed:空Word特判//
    if(isSymbol(s))return 1;
    string syb=s.substr(0,1),wd=s.substr(1);
    return isSymbol(syb)&&isWord(wd);
}
bool isPrefix(ipt)//<prefix> ::= <word>|<prefix>.<word>//
{
    if(isWord(s))return 1;
    int t=s.rfind('.');
    if(t==string::npos)return 0;
    string pfx=s.substr(0,t),wd=s.substr(t+1);
    return isPrefix(pfx)&&isWord(wd);
}
bool isDomain(ipt)//<domain> ::= <letter><letter>|<letter><letter><letter>//
{
    if(s.size()<2||s.size()>3)return 0;
    for(int i=0;i!=s.size();++i)
        if(!isalpha(s[i]))
            return 0;
    return 1;
}
bool isSuffix(ipt)//<suffix> ::= <prefix>.<domain>//
{
    int t=s.rfind('.');
    if(t==string::npos)return 0;
    string pfx=s.substr(0,t),dmn=s.substr(t+1);
    return isPrefix(pfx)&&isDomain(dmn);
}
bool isEmail(ipt)//<address> ::= <prefix>@<suffix>//
{
    int t=s.rfind('@');
    if(t==string::npos)return 0;
    string pfx=s.substr(0,t),sfx=s.substr(t+1);
    return isPrefix(pfx)&&isSuffix(sfx);
}
int main()
{
    int n;
    scanf("%d\n",&n);
    while(n--)
    {
        string s;
        getline(cin,s);
        cout<<(isEmail(s)?"YES":"NO")<<endl;
    }
    return 0;
}

参考资料和拓展阅读

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

著作权声明[编辑]

关于[编辑]