题目描述:
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度大于2的子串重复
输入描述:
一组或多组长度超过2的字符串。每组占一行
输出描述:
如果符合要求输出:OK,否则输出NG
示例:
输入:021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000
输出:OK NG NG OK
解题思路:
首先判断输入的密码长度是否大于等于8 ,满足条件1;再分别统计大写小写数字以及其他字符出现的个数,若某类字符出现次数不为0则让flag加一,flag大于等于3则满足条件2;因为不能有相同长度大于2的子串重复,也就是密码中任意3个字符的组合不能再出现第二次,那么可以从密码起点开始遍历,提取以某点为起点的三个字符组成一个新的子字符串,再从这个点后面的点开始查找有没有一样的字符串,若没找到则满足条件3。
测试代码:
#include <iostream> #include <vector> #include <string> #include <map> using namespace std; int main() { vector<string> input; vector<string> result; string in; while(cin>>in) { int lower=0; int upper=0; int number=0; int other=0; int flag=0; if(in.size()<=8) { result.push_back("NG"); continue; } for(int i=0;i<in.size();++i) { if(in[i]>=65&in[i]<=90) upper++; else if(in[i]>=97&in[i]<=122) lower++; else if(in[i]>=48&in[i]<=57) number++; else other++; } if(lower!=0)flag++; if(upper!=0)flag++; if(number!=0)flag++; if(other!=0)flag++; if(flag<3) { result.push_back("NG"); continue; } bool isfind=false; for(int i=0;i<in.size()-2;++i) { string temp=in.substr(i,3); if(in.find(temp,i+3)!=in.npos) { isfind=true; break; } } if(isfind) { result.push_back("NG"); continue; } result.push_back("OK"); } for(auto i:result) { cout<<i<<endl; } return 0; }