题目描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度超2的子串重复
说明:长度超过2的子串
输入描述:
一组或多组长度超过2的子符串。每组占一行
输出描述:
如果符合要求输出:OK,否则输出NG
示例1
输入
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
输出
OK
NG
NG
OK
1.通过60%的测试用例
是因为第一个条件。字符串长度要超过8,长度为8也不行
修改这一条件后,通过了
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
using namespace std;
bool IsLeastThree(int p1,int p2,int p3,int p4)
{
if(p1 && p2 && p3 && p4) //包含四种字符
return true;
if(((p1==0) && p2 && p3 && p4)||(p1 && (p2==0) && p3 && p4)||(p1 && p2 && (p3==0) && p4)||(p1 && p2 && p3 && (p4==0))) //包含三种字符
return true;
return false;
}
//这一个函数没写出了,参考的后面的讨论去答案
bool three_repeat(string str){ //判断str字符串中是否有2个以上的重复子字符串,若是没有找到则返回true否则返回false
string extract;
for(int i=0;i+3<str.size();++i){
extract=str.substr(i,3);
if(str.find(extract,i+3)==-1){ //若在后面的字符串中没有找到,就i+1继续找
}
else
return false; //否则就是在后面的字符串中找到了
}
return true;
}
bool IsStand(string &s)
{
if(s.size()<=8) //长度超过8
return false;
int A,a,number,other;
A=a=number=other=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='A'&&s[i]<='Z') //大写字母
A++;
else if(s[i]>='a'&&s[i]<='z') //小写字母
a++;
else if(s[i]>='0'&&s[i]<='9') //数字
number++;
else
other++;
}
if(IsLeastThree(A,a,number,other)) //至少含3种符号
{
if(three_repeat(s))
return true;
else
return false;
}
return false;
}
int main()
{
string str;
string flag;
while(cin>>str)
{
if(IsStand(str))
flag="OK";
else
flag="NG";
cout<<flag<<endl;
}
//cout<<flag<<endl;
return 0;
}
这题卡在这个点上了,即上面的条件3.
下面这个方法很好,因为上面说了不能有长度超过2的子串,那么只要我们找出一个长度超过2的子串即可否定。所以找是否有长度为3的子串。
//这一个函数没写出了,参考的后面的讨论去答案
bool three_repeat(string str){ //判断str字符串中是否有2个以上的重复子字符串,若是没有找到则返回true否则返回false
string extract;
for(int i=0;i+3<str.size();++i){
extract=str.substr(i,3);
if(str.find(extract,i+3)==-1)
{ //若在后面的字符串中没有找到,就i+1继续找
}
else
return false; //否则就是在后面的字符串中找到了
}
return true;
}