一.前言
补修的第一个学期终于过半,程序设计的题目也开始难度加大(还是我太菜),有时间对一些题做个简单记录。欢迎指出我的错误以及交流思路^-^。
二.问题描述
三.问题分析及思路
根据题意选出符合有效的地址即可,放进了set去重。本来应该用有效个数=@前符合标准的个数*@后符合标准的字母个数来解决的。看到中间出现了多个@的样例,最后还是完全模拟了选有效地址的过程做的。
1.定义step记录地址检查到第几步,temp字符串记录有效字符
2.当前字符符合要求则temp+当前字符
3.字母开头则step=1,之后取任意字符(除了“.”)
4.遇到@后step=2,之后为字母和数字
5.遇到“.”后step=3,之后为字母就加上这个字母,并存入结果的set
四.代码
没有AC,样例2的两个地址其实是重复的,应该是样例错误。
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
int count_validaddress(string a);
int main()
{
string x;
cin>>x;
cout<<count_validaddress(x)<<endl;
return 1;
}
int count_validaddress(string a)
{
int step;
string temp;
set<string> validstr;
//挑选有效地址
for(int i=0;i<a.length();i++) //从第一个字符开始寻找
{
temp="";
step=0;
for(int j=i;j<a.length();j++)
{
if(step==0&&a[j]>='a'&&a[i]<='z')
{
temp+=a[j]; //选定字母开头
step=1;
}
else if(step==1&&a[j]!='.'&&a[j]!='@') temp+=a[j]; //@前不能出现'.'
else if(step==1&&a[j]=='.') break; //出现'.'说明以选定的字符开头开始,没有有效地址
else if(step==1&&a[j]=='@')
{
temp+=a[j];
step=2;
}
else if(step==2&&a[j]=='@') break; //对于单个有效地址,@之后不能再出现@了
else if(step==2&&((a[j]>='0'&&a[j]<='9')||(a[j]>='a'&&a[j]<='z')))
{
temp+=a[j];
}
else if(step==2&&a[j]=='.') //出现'.',接下来是字母构成的字符串
{
temp+=a[j];
step=3;
}
else if(step==3&&(a[j]=='.'||a[j]=='_'||a[j]=='@')) break;
else if(step==3&&a[j]>='a'&&a[j]<='z') //符合条件的字符串为有效
{
temp+=a[j];
validstr.insert(temp);
//cout<<temp<<endl;
}
//cout<<temp<<" "<<step<<endl;
}
}
return validstr.size();
}