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