题解 | #密码验证合格程序#
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
//检测字符串s中是否有大小写字母、数字、其它符号四种中至少三种
bool char_in_str(string s) {
int sum = 0;
int i;
string num("0123456789");
for (i = 0; i < 26; ++i) {
if (find(s.begin(), s.end(), 'a' + i) != s.end()) { //小写字母
sum++;
break;
}
}
for (i = 0; i < 26; ++i) {
if (find(s.begin(), s.end(), 'A' + i) != s.end()) { //大写字母
sum++;
break;
}
}
for (auto it = num.begin(); it != num.end(); ++it) { //数字
if (find(s.begin(), s.end(), *it) != s.end()) {
sum++;
break;
}
}
for (i = 0; i < s.size(); ++i) {
if (!isalnum(s[i]) && s[i] != 0 && s[i] != '\n') { //其他符号
sum++;
break;
}
}
if (sum > 2) {
return true;
} else {
return false;
}
}
//检测字符串s中是否有长度大于2的子串重复
bool no_same_substr(string s) {
int k = 0;
for (int k = 0; k < s.size() - 3; ++k) {
string t(s, k, 3);//将s中从k开始的3个字符赋给t
string q(s, k + 3, s.size());//将s中从k+3开始的字符赋给q
if (q.find(t) != string::npos) { //如果q中有t
return false;
}
}
return true;
}
int main() {
string s;
while (getline(cin, s)) {
bool res1 = char_in_str(s);
bool res2 = no_same_substr(s);
if (s.size() > 8 && res1 && res2) {
cout << "OK" << endl;
} else {
cout << "NG" << endl;
}
}
return 0;
}
密码要求:
1.长度超过8位
s.size()>8
2.包括大小写字母、数字、其他符号四种中至少三种
对密码字符串s,依次检测其中是否有大写字母、小写字母、数字和其他符号,每存在一种类型就在总数sum上加1,最后如果sum大于等于3即密码合格;
3.不能有长度大于2的包含公共元素的子串重复
对于这个要求,我的理解是,不需要考虑子串重叠的情况。
思路:对于字符串s,将前三个字符(s[k],s[k+2], k=0)赋给t,t后面的赋给q,检测q中是否有t,如果有说明s中t是重复的,密码不合格;如果没有,++k,继续上述操作,直到遍历s,说明s中无重复子串。