java解法
1)先判断字符串长度是否大于8(首要条件);
2)在判断是否包含三种类型的字符,若满足则继续判断是否有重复子字符串,否则标志位全置false,输出“NG”。
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String s = sc.next();
            boolean flag = true;
            boolean flag1 = s.length()>8 ? true : false;    //字符串长度要大于8
            if(judge(s)){     //如果judge判断到满足“三种类型字符以上”条件,则判断是否存在重复子字符串
                for(int i=0; i<s.length()-4; i++){
                    String substr = s.substring(i,i+3);
                    if(s.substring(i+1).contains(substr)) flag = false;   //如果存在重复子字符串则标志flag=false
                }
            }else{    //如果judge判断到不满足“三种类型字符以上”条件,则所以标志置为false
                flag = false;
                flag1 = false;
            }
            if(flag && flag1) System.out.println("OK");
            else System.out.println("NG");
        }
    }
    public static  boolean judge(String s){
        boolean flag1 = false, flag2 = false, flag3 = false, flag4 = false;
            for(char c : s.toCharArray()){
                if(c>='a'&& c<='z') flag1 = true;
                else if(c>='A'&& c<='Z') flag2 =true;
                else if(c>='0'&& c<='9') flag3 = true;
                else flag4 = true;
            }
   //满足有其中三种类型的字符则返回true
        if((flag1 && flag2 && flag3)||(flag1 && flag2 && flag4)||(flag1 && flag3 && flag4)||(flag2 && flag3 &&flag4)){
            return true;
        }
        else return false;
    }
}