bool substrnum(string s)
{
int n = s.size();
int m = 0;//相同长度
for(int i=0;i<n-2;++i){
for(int j=i+2;j<n-2;++j){
int tmp = 0;
while(s[i+tmp] == s[j+tmp]){//暴力主次比较
m += 1;
++tmp;
}
if( m > 2 )
return false;
else
m = 0;
}
}
return true;
}
应用:
题目描述
密码要求
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度大于2的子串重复
输入描述:
一组或多组长度超过2的子符串。每组占一行
输出描述:
如果符合要求输出:OK,否则输出NG
示例1
输入
复制
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
输出
复制
OK
NG
NG
OK
#include <iostream>
#include <string>
#include <vector>
using namespace std;
/*
bool substrnum(string str)
{
string substr;
for(int i=0;i+3<str.size();i++){
substr=str.substr(i,3);
if(str.find(substr,3)==-1){
continue;
}else{
return false;
}
}
return true;
}
*/
bool substrnum(string s)
{
int n = s.size();
int m = 0;
for(int i=0;i<n-2;++i){
for(int j=i+2;j<n-1;++j){
int tmp = 0;
while(s[i+tmp] == s[j+tmp]){
m += 1;
++tmp;
}
if( m > 2 )
return false;
else
m = 0;
}
}
return true;
}
int main()
{
string str;
while(getline(cin,str))
{
int sum=0;
vector<int> Flag={0,0,0,0};
if(str.size()<=8) goto NG;
for(int i=0;i<str.size();++i){
if(str[i]>='a' && str[i]<='z') Flag[0]=1;
else if(str[i]>='A'&& str[i]<='Z') Flag[1]=1;
else if(str[i]>='0'&& str[i]<='9') Flag[2]=1;
else Flag[3]=1;
}
for(int i=0;i<4;i++){
sum+=Flag[i];
}
if(sum<3) goto NG;
if(substrnum(str)==0 ) goto NG;
/*
for(int i = 0; i <= str.size()-6; i++)
for(int j = i+3;j < str.size();j++)
if(str[i] == str[j] && str[i+1] == str[j+1] &&str[i+2] == str[j+2]) goto NG;*/
OK:
cout<<"OK"<<endl;continue;
NG:
cout<<"NG"<<endl;
}
return 0;
}