密码验证合格程序(华为oj)

密码要求:
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;
}

坚持每天写一点。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值