题目来源
题目描述
题目解析
分三步一次检查上面的要求就行了:
- 第一步:判断输入的字符串长度
- 第二步:出现符号至少要三种。
- 准备一个长度为4的辅助数组,初始为0
- 遍历字符串,检查每种字符是否出现,如果出现则数组相应位置置于1
- 最后数组4个元素相加,如果小于3,还是输出NG,后面不用管
- 第三步:检查是否有相同长度大于2的子串重复
- 大于2,那么我们找长度为3的重复子串就行了,因为大于3的页一定包含了这个3
- 怎么检测呢?两层遍历字符串,指针之间间隔三个,用substr函数截取两个下标开始的三位字符,检查是否相同,若是相同,也是NG。
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
while (cin >> s){
if(s.length() <= 8){
cout << "NG" << endl;
continue;
}
int flag[4] = {0};
for (int i = 0; i < s.length(); ++i) {
if(s[i] >= 'A' && s[i] <= 'Z'){
flag[0] = 1;
}else if(s[i] >= 'a' && s[i] <= 'z') //小写字母
flag[1] = 1;
else if(s[i] >= '0' && s[i] <= '9') //数字
flag[2] = 1;
else //其他符号
flag[3] = 1;
}
if(flag[0] + flag[1] + flag[2] + flag[3] < 3){ //符号少于三种
cout << "NG" << endl;
continue;
}
bool repute = false;//遍历检查是否有长度为3的相同的字串
for (int i = 0; i <= s.size() - 6; ++i) {
for (int j = i + 3; j < s.size(); ++j) {
if(s.substr(i, 3) == s.substr(j, 3)){
repute = true;
break;
}
}
}
if(repute) //有重复
cout << "NG" << endl;
else
cout << "OK" << endl;
}
return 0;
}