题解 | 密码验证合格程序

密码验证合格程序

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 条)

  1. 长度 ≥ 8
  2. 必须包含大写、小写、数字、特殊符号中的至少 3 种
  3. 不能出现两个长度 >2 的完全相同、独立连续子串 例如:abc123abcabc 重复出现 → 不合格

二、整体解题思路(4 大步)

1. 输入读取

  • 读取多组密码字符串,直到输入结束
  • 存入二维字符数组,方便逐条判断

2. 字符类型统计

遍历密码每一位,标记是否出现:

  • 大写字母 A~Z
  • 小写字母 a~z
  • 数字 0~9
  • 特殊符号(其他字符)

3. 重复子串检查(最难部分)

检查是否存在长度 ≥3 的两段完全相同的子串:

  • 枚举子串长度 L = 3、4……
  • 枚举第一个子串起始位置
  • 枚举第二个子串起始位置
  • 复制两个子串进行比较
  • 如果相等 → 密码非法

4. 最终判断

只要以下任意一条不满足,输出 NG,否则输出 OK:

  • 长度 <8
  • 字符种类 <3
  • 存在长度 > 2 的重复子串
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务