密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度超2的子串重复
说明:长度超过2的子串
知识点 字符串,数组
运行时间限制 0M
内存限制 0
输入
一组或多组长度超过2的子符串。每组占一行
输出
如果符合要求输出:OK,否则输出NG
每行输出对应一组输入的结果;
样例输入 021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000
样例输出 OK NG NG OK
分析:题目有3个要求,前两个很容易写。最后一个要求的意思是字符串的字串如果有重复出现的,则长度不能超过2.
使用了substr(i,j)-截取从第i位置的j个字符,find(“str”,k)从第k个位置查找是否有str字串,若有则返回首次出现的下标,反之返回-1
头文件:#include islower()是否为小写字母,isupper()是否为大写字母,isdigit()数字
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
bool check_w(string str)
{
if(str.length()<=8) //length>8
return false;
int isNum=0,isLower=0,isUpper=0,isOther=0;
for(int i=0;i<str.length();i++) //大小写字母、数字、其他至少三种
{
if(islower(str[i]))
isLower=1;
else if(isupper(str[i]))
isUpper=1;
else if(isdigit(str[i]))
isNum=1;
else
isOther=1;
if((isNum+isLower+isUpper+isOther)==3)
break;
}
if((isNum+isLower+isUpper+isOther)<3)
return false;
int b;
for(int i=0;i<=str.length()-3;i++) //重复字符字串长度不超过2
{
for(int j=3;j<str.length()/2;j++)
{
string temp=str.substr(i,j);
b=str.find(temp,i+3);
if(b>-1)
return false;
}
}
return true;
}
int main(void)
{
string str;
while(getline(cin,str))
{
if(check_w(str))
cout<<"OK"<<endl;
else
cout<<"NG"<<endl;
}
return 0;
}
坚持每天写一点。