题目描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度超2的子串重复
说明:长度超过2的子串
输入描述:
一组或多组长度超过2的子符串。每组占一行
输出描述:
如果符合要求输出:OK,否则输出NG
示例1
输入
复制
021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000
输出
复制
OK NG NG OK
#include <iostream>
using namespace std;
/**
* @brief :密码验证合理性
* @要求: 1.长度超过8位
* 2.包括大小写字母,数字。其他符号至少四钟以上
* 3.不能有相同长度超过2的子串重复
* output:如果符合要求输出:OK,否则输出NG
*/
string Password_Verification(string str)
{
int len=str.size();
int a[4]={0};//初始化一个数组,0.1记录每一位类型字符出现情况
int count=0;//记录有多少种字符
int num=0; //记录相同长度超过2的子串重复对数
for(int i=0;i<len;i++)
{
if(str[i]>='A'&&str[i]<='Z'){
a[0]=1;
}
else if(str[i]>='a'&&str[i]<='z'){
a[1]=1;
}
else if((str[i]>='0')&&str[i]<=9){
a[2]=1;
}else{
a[3]=1;
}
}
/*计算字符串包含字符的种类数*/
for(int i=0;i<4;i++){
if(a[i]==1){
count++;
}
}
//判断字符串是否包含长度超 2 的两个以上相同子串,故考虑长度为 3 的子字符串是否有重复即可,
//从而子字符串有(len - 2)种可能,但作为基准子字符串的只需要(len - 3)个即可
//因为最后一个子字符串被反复判断的次数最多,并且在它之后没有可以比较的子字符串了,
//所以 i <= len - 6,即最后一个基准子字符串是倒数第二个子字符串
for(int i=0;i<=len-6;i++){
for(int j=i+3;j<=len-3;j++){
if((str[i]==str[j])&&(str[i+1]==str[j+1])&&(str[i+2])==str[j+2]){
num++;//记录相同长度超过2的子串重复对数
}
if(num!=0){
break;
}
}
}
if((len>8)&&(count>=3)&&(num==0)){
return "OK";
}
else if((len<=8)||(count<3)||num!=0){
return "NG";
}
}
int main(int argc, char *argv[])
{
string str="021Abc9Abc1";
cout << Password_Verification(str) << endl;
return 0;
}