NowCode:HJ20 密码验证合格程序

题目: 密码验证合格程序

描述

你需要书写一个程序验证给定的密码是否合格。

合格的密码要求:
∙ ∙长度至少 8 位
∙ ∙必须包含大写字母、小写字母、数字、特殊字符中的至少三种
∙ ∙不能分割出两个独立的、长度大于 2 的连续子串,使得这两个子串完全相同;更具体地,如果存在两个长度大于 22 的独立子串 s1,s2s1,s2 ,使得 s1=s2s1=s2 ,那么密码不合法。

子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。

可见字符集为 ASCII 码在 3333 到 126126 范围内的可见字符。您可以参阅下表获得其详细信息(您可能关注的内容是,这其中不包含空格、换行)。

输入描述:

本题将会给出 1≦T≦101≦T≦10 组测试数据,确切数字未知,您需要一直读入直到文件结尾;每组测试数据描述如下:

在一行上输入一个长度为 1≦length(s)≦1001≦length(s)≦100 ,由可见字符构成的字符串 ss ,代表待判断的密码。

输出描述:

对于每一组测试数据,新起一行。若密码合格,输出 OKOK ,否则输出 NGNG 。

示例1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
021Abc1111

输出:
OK
NG
NG
OK
OK

说明:
对于第二组测试数据,
"Abc9Abc1"
"Abc9Abc1" 中存在两个长度大于 2 的独立子串
"Abc"
"Abc" ,即橙色标记部分。对于第三组测试数据,仅包含大写字母和数字,不满足条件。

示例2

1
2
3
4
5
6
7
8
9
10
输入:
Abc1@
A1@ababa@1A

输出:
NG
OK

说明:
对于第一组测试数据,长度不足 8 位,不满足条件。

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
using namespace std;

bool IsTypeLegal(const string& str)
{
int upper = 0, lower = 0, num = 0, other = 0;
for (int i = 0; i < str.size(); i++) {
if (str[i] >= '0' && str[i] <= '9') {
num = 1;
} else if (str[i] >= 'A' && str[i] <= 'Z') {
upper = 1;
} else if (str[i] >= 'a' && str[i] <= 'z') {
lower = 1;
} else if (str[i] != ' ' && str[i] != '\n') {
other = 1;
} else {
continue;
}
}
int sumType = upper + lower + num + other;
if (sumType >= 3) {
return true;
} else {
return false;
}
}

bool RepeatExThree(string& str)
{
size_t size = str.size();
for (int i = 0; i < size - 6; i++) {
for (int j = i + 3; j < size - 3; j++) {
if (str[i] == str[j] && str[i + 1] == str[j + 1] && str[i + 2] == str[j + 2]) {
return true;
}
}
}
return false;
}

int main()
{
string input;
while (cin >> input) {
size_t size = input.size();
if (size < 8 || size > 100) {
cout << "NG" << endl;;
continue;
}
if (!IsTypeLegal(input)) {
cout << "NG" << endl;
continue;
}
if (RepeatExThree(input)) {
cout << "NG" << endl;
continue;
}
cout << "OK" << endl;
}
}

思路

题目要求了密码字符类型超过三种,不存在两个独立、长度超过2的相同子串。

将i 与 i + 3比较

将i + 1 与 i + 4比较

将i + 2 与 i + 5比较

此题挺好