直接暴力求解的,这个程序的话,求八位数和数字判断都很简单,最后一个使用三层循环去枚举三个的子串就可以了
然后如果有数字,数字项=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; }