| 题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
|---|---|---|---|---|---|
| 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>
按照题目要求一个个判断模拟即可,实现起来也不算太恶心。两点需要注意:
| 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;
}
|