密码验证合格程序

题目描述

密码要求:

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值