【华为oj】密码验证合格程序

来源:互联网 发布:淘宝达人的短视频教程 编辑:程序博客网 时间:2024/05/29 10:57

问题描述:

密码是否合格的要求

1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度超2的子串重复
说明:长度超过2的子串
知识点:  字符串,数组  
题目来源:  内部整理  
练习阶段:  中级  
运行时间限制: 无限制 

内存限制: 无限制 


输入:  
一组或多组长度超过2的子符串。每组占一行

输出:  
如果符合要求输出:OK,否则输出NG
每行输出对应一组输入的结果;

样例输入: 021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
                 

样例输出: 

OK

NG
NG

OK 

问题分析:不能有相同长度超2的子串重复指===例如:aaaa就有两个长度超过了2的子串重复了,aaa、aaa重复了,又如:abcabc,同样的道理,也不符合要求,所以,需要你一个一个的递增遍历比较。

代码:

#include<iostream>#include<string>typedef unsigned int uint;using namespace std;//字符串长度检测bool changdu(string str){if (str.size() <= 8)return false;else return true;}bool checkall(string str)//检测字符串包含字符的类型{uint len;bool flags = false, flagdd = false, flagxd = false, flagf = false;//flags=数字,flagxd=小写字母,flagdd=大写字母, flagf=其他字符len = str.size();for (uint i = 0; i < len; i++){if ('0' <= str[i] && str[i] <= '9')flags = true;else if ('a' <= str[i] && str[i] <= 'z')flagxd = true;else if ('A' <= str[i] && str[i] <= 'Z')flagdd = true;else if ((32 <= str[i] && str[i] <= 47) || (58 <= str[i] && str[i] <= 64) || (91 <= str[i] && str[i] <= 96) || (123 <= str[i] && str[i] <= 126))flagf = true;}if ((flags && flagdd && flagxd && flagf) || (flagdd && flagxd && flagf) || (flags && flagxd && flagf) || (flags && flagdd && flagf) || (flags && flagdd && flagxd))//字符类型大于等于3,返回truereturn true;else return false;}bool zichuan(string str)//字串重复检测{uint len = str.size();for (uint i = 0; i < len-3; i++){for (uint j = i + 1; j < len-2; j++){if (str[i] == str[j] && str[i+1] == str[j+1] && str[i+2] == str[j+2]){return false;}}}return true;}void puanduan(string *str,uint pos){for (uint i = 0; i < pos; i++){bool flag1 = changdu(str[i]);bool flag2 = checkall(str[i]);bool flag3 = zichuan(str[i]);if (flag1&&flag2&&flag3)cout << "OK";else cout << "NG";//if (i!=pos-1)cout << endl;}}int main(){uint pos = 0;string *str = new string[100];getline(cin,str[0]);while (str[pos]!=""){pos++;getline(cin, str[pos]);}puanduan(str, pos);return 0;}


0 0
原创粉丝点击