题解 | 密码验证合格程序
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
#include <stdio.h>
#include <string.h>
#define T 10
int main() {
char s[T][100];
int n=0,i,j,p=0,q=0;
while(scanf("%s",s[n])!=EOF){
n++;
}
for(i=0;i<n;i++){
int A=0,a=0,num=0,spe=0,hrs=0;
for(j=0;j<strlen(s[i]);j++){
if(s[i][j]>='A'&&s[i][j]<='Z'){
A=1;
}
else if(s[i][j]>='a'&&s[i][j]<='z'){
a=1;
}
else if(s[i][j]>='0'&&s[i][j]<='9'){
num=1;
}
else{
spe=1;
}
}
for(int L=3;L<=strlen(s[i])/2;L++){
for(int i1=0;i1+2*L<=strlen(s[i]);i1++){
for(int i2=i1+L;i2<=strlen(s[i])-L;i2++){
char s1[100]={0},s2[100]={0};
for(q=i1;q<i1+L;q++){
s1[p]=s[i][q];
p++;
}
for(q=i2+L-1;q>=i2;q--){
p--;
s2[p]=s[i][q];
}
if(strcmp(s1,s2)==0){
hrs=1;
break;
}
}
}
}
if(strlen(s[i])<8||A+a+num+spe<3||hrs){
printf("NG\n");
}else{
printf("OK\n");
}
}
return 0;
}
一、题目要求(必须满足 3 条)
- 长度 ≥ 8
- 必须包含大写、小写、数字、特殊符号中的至少 3 种
- 不能出现两个长度 >2 的完全相同、独立连续子串
例如:
abc123abc→abc重复出现 → 不合格
二、整体解题思路(4 大步)
1. 输入读取
- 读取多组密码字符串,直到输入结束
- 存入二维字符数组,方便逐条判断
2. 字符类型统计
遍历密码每一位,标记是否出现:
- 大写字母 A~Z
- 小写字母 a~z
- 数字 0~9
- 特殊符号(其他字符)
3. 重复子串检查(最难部分)
检查是否存在长度 ≥3 的两段完全相同的子串:
- 枚举子串长度 L = 3、4……
- 枚举第一个子串起始位置
- 枚举第二个子串起始位置
- 复制两个子串进行比较
- 如果相等 → 密码非法
4. 最终判断
只要以下任意一条不满足,输出 NG,否则输出 OK:
- 长度 <8
- 字符种类 <3
- 存在长度 > 2 的重复子串
查看14道真题和解析