直接暴力求解的,这个程序的话,求八位数和数字判断都很简单,最后一个使用三层循环去枚举三个的子串就可以了
然后如果有数字,数字项=1,如果有小写字母,小写字母项=1,有大写字母项,大写字母=1,有其他字符,其他字符=1,这四个变量加起来>=3就是合格的。
三层循环的判断的话可以先看i和j的范围以及遍历
i=0时
(012) 和(345)(456)(567)(678)(789)(89 10) 对比
i=1时
(123) 和(456)(567)(678)(789)(89 10) 对比
i=2时
(234) 和(567)(678)(789)(89 10) 对比
.......
一次往下推导,得到i和j的循环起始和终止
for(int i=0;i<=len-6;i++)
for(int j=i+3;j<=len-3;j++)在这两层循环里面判断i到i+3 和j到j+3的大小,这里需要注意,如果说有长度为3的子串就一定会有长度为4的子串,所以只要找到长度为3的子串就可以了。
在这里的话比较也可以这么写
> for(int i=0;i<len-4;i++){
> for(int j=i+3;j<=len-3;j++){
> //比较有没有三个相同的值
> if(strncmp(pstr+i,pstr+j,3)==0){
> flag=1;
> break;
> }
> }
> if(flag) break;
> }这样可以不用自己再去套第三层循环多加变量
#include<iostream>
#include<string.h>
using namespace std;
string str;
//1.长度超过8位
//2.包括大小写字母.数字.其它符号,以上四种至少三种
//3.不能有相同长度大于2的子串重复
int main(){
while(cin>>str){
//长度超过8位或者有大小写和数字等
int low=0,cap=0,num=0,other=0,len=0;
for(int i=0;str[i]!=0;i++){
if(str[i]>='0'&&str[i]<='9'){
num=1;
}else if(str[i]>='a'&&str[i]<='z'){
low=1;
}else if(str[i]>='A'&&str[i]<='Z'){
cap=1;
}else{
other=1;
}
len=i+1;
}
if((low+cap+num+other)<3||len<=8){
cout<<"NG"<<endl;
continue;
}
//判断子串的情况
//存在长度为4的就一定存在长度为3的,所以只判断为3的情况
int flag=0;
char *pstr = (char *)str.c_str();
//字符数组转字符指针
for(int i=0;i<len-4;i++){
for(int j=i+3;j<=len-3;j++){
//比较有没有三个相同的值
int s1=i,s2=j,k=0;
for(k=0;k<3;k++){
if(str[s1+k]!=str[s2+k]){
break;
}
}
if(k==3){
flag=1;
break;
}
}
if(flag) break;
}
if(flag){
cout<<"NG"<<endl;
continue;
}
cout<<"OK"<<endl;
}
return 0;
}
京公网安备 11010502036488号