- 对于至少3种类型,设置4个标志位,然后循环迭代看落到哪个区间。
- 对于连续长度为3的字串不能出现第二次,那就是使用string 的 find 方法,找不到会返回 npos。
- 程序的分模块设计思想。
#include<bits/stdc++.h> using namespace std; bool checksubstr(string s){// 相同长度字串不能出现两次 // 巧用 字符串 find 方法,每三个持续往后找 for(int i = 0; i < s.size()-3; i++){ string tar = s.substr(i,3); if(s.find(tar,i+3)!=s.npos){ return false; } } return true; } bool checkchar(string s){//包括大小写字母.数字.其它符号,以上四种至少三种 // 检查标志位 int i0 = 0, i1 = 0, i2 = 0, i3 = 0; for(int i = 0; i< s.size();i++){ if(s[i]>='0'&&s[i]<='9'){ i0 = 1; }else if(s[i]>='a'&&s[i]<='z'){ i1 = 1; }else if(s[i]>='A'&&s[i]<='Z'){ i2 = 1; }else{ i3 = 1; } } if(i1+i2+i3+i0>=3){// 最后就是标志位加起来大于等于3 return true; } return false; } int main(){ string s; while(cin>>s){ if(s.size()>8&&checksubstr(s)&&checkchar(s)){ cout<<"OK"<<endl; }else{ cout<<"NG"<<endl; } } return 0; }