题解 | #密码验证合格程序#c++
密码验证合格程序
http://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// bool isDuplicate(string s){
// for(int i=0;i<s.size()-1;i++){
// if()
// }
// }
bool isValid3(string s) {
string tmp;
// 先尝试找到符合条件的子字符串
int length = 3;
int start = 0;
while (length <= int(s.size() / 2)) {
// 找到符合当前长度的子字符串
while ((int(tmp.size()) < length) && ((start+length) < s.size())) {
tmp.push_back(s[start + tmp.size()]);
// 有相同的,不符合要去
if (tmp.rfind(s[start + tmp.size() - 1]) != (tmp.size() - 1)) {
tmp.clear();
start ++;
}
}
if(tmp.size()==0) continue;
// 开始比较, 如果找到
if (s.find(tmp, start + length)!=string::npos) {
return false;
}
start++;
tmp.clear();
if ((start+length) >= (s.size()-length)){
length++;
start = 0;
continue;
}
}
return true;
}
int main(void) {
string s;
vector<bool> isCounted(4,false);
int count = 0;
while (cin >> s) {
if (s.size() <= 8) {
cout << "NG" << endl;
continue;
}
for (int i = 0; i < s.size(); i++) {
// 包含大写字母
if (s[i] >= 'A' && s[i] <= 'Z') {
if(isCounted[0]) continue;
count++;
isCounted[0]=true;
continue;
}
// 包含小写字母
if (s[i] >= 'a' && s[i] <= 'z') {
if(isCounted[1]) continue;
count++;
isCounted[1]=true;
continue;
}
if (s[i] >= '0' && s[i] <= '9' ) {
if(isCounted[2]) continue;
count++;
isCounted[2]=true;
continue;
}
if(!isCounted[3]){
count++;
isCounted[3]=true;
}
}
if (count < 3) {
cout << "NG" << endl;
continue;
}
count = 0;
isCounted[0]=isCounted[1]=isCounted[2]=isCounted[3]=false;;
if (!isValid3(s)) {
cout << "NG" << endl;
continue;
}
cout << "OK" << endl;
}
return 0;
}