当前位置: 首页 > article >正文

Java | Leetcode Java题解之第420题强密码检验器

题目:

题解:

class Solution {
    public int strongPasswordChecker(String password) {
        int n = password.length();
        int hasLower = 0, hasUpper = 0, hasDigit = 0;
        for (int i = 0; i < n; ++i) {
            char ch = password.charAt(i);
            if (Character.isLowerCase(ch)) {
                hasLower = 1;
            } else if (Character.isUpperCase(ch)) {
                hasUpper = 1;
            } else if (Character.isDigit(ch)) {
                hasDigit = 1;
            }
        }
        int categories = hasLower + hasUpper + hasDigit;

        if (n < 6) {
            return Math.max(6 - n, 3 - categories);
        } else if (n <= 20) {
            int replace = 0;
            int cnt = 0;
            char cur = '#';

            for (int i = 0; i < n; ++i) {
                char ch = password.charAt(i);
                if (ch == cur) {
                    ++cnt;
                } else {
                    replace += cnt / 3;
                    cnt = 1;
                    cur = ch;
                }
            }
            replace += cnt / 3;
            return Math.max(replace, 3 - categories);
        } else {
            // 替换次数和删除次数
            int replace = 0, remove = n - 20;
            // k mod 3 = 1 的组数,即删除 2 个字符可以减少 1 次替换操作
            int rm2 = 0;
            int cnt = 0;
            char cur = '#';

            for (int i = 0; i < n; ++i) {
                char ch = password.charAt(i);
                if (ch == cur) {
                    ++cnt;
                } else {
                    if (remove > 0 && cnt >= 3) {
                        if (cnt % 3 == 0) {
                            // 如果是 k % 3 = 0 的组,那么优先删除 1 个字符,减少 1 次替换操作
                            --remove;
                            --replace;
                        } else if (cnt % 3 == 1) {
                            // 如果是 k % 3 = 1 的组,那么存下来备用
                            ++rm2;
                        }
                        // k % 3 = 2 的组无需显式考虑
                    }
                    replace += cnt / 3;
                    cnt = 1;
                    cur = ch;
                }
            }
            if (remove > 0 && cnt >= 3) {
                if (cnt % 3 == 0) {
                    --remove;
                    --replace;
                } else if (cnt % 3 == 1) {
                    ++rm2;
                }
            }
            replace += cnt / 3;

            // 使用 k % 3 = 1 的组的数量,由剩余的替换次数、组数和剩余的删除次数共同决定
            int use2 = Math.min(Math.min(replace, rm2), remove / 2);
            replace -= use2;
            remove -= use2 * 2;
            // 由于每有一次替换次数就一定有 3 个连续相同的字符(k / 3 决定),因此这里可以直接计算出使用 k % 3 = 2 的组的数量
            int use3 = Math.min(replace, remove / 3);
            replace -= use3;
            remove -= use3 * 3;
            return (n - 20) + Math.max(replace, 3 - categories);
        }
    }
}

http://www.kler.cn/a/320978.html

相关文章:

  • Docker环境搭建Cloudreve网盘服务(附shell脚本一键搭建)
  • 丹摩征文活动 |【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解
  • 使用 Web Search 插件扩展 GitHub Copilot 问答
  • git撤销、回退某个commit的修改
  • HarmonyOS 开发环境搭建
  • More effective C++:杂项
  • 微调大模型(Finetuning Large Language Models)—Why Finetune(一)
  • 目标检测——VOC2007数据集
  • Git 安装教程
  • 什么是共享旅游卡?解析共享旅游创业项目认知与代理攻略
  • 代理IP对于网络爬虫业务的重要性
  • 使用集成学习对不同的机器学习方法进行集成
  • AWS账单不支付账号会停用吗?
  • 拥塞控制算法的 rtt 公平性
  • webpack4 target:“electron-renderer“ 打包加速配置
  • python:django项目知识点01——前期配置、用户管理、权限核验、django-orm
  • C++之分割字符串的两种方式
  • CentOS Stream 9部署Redis
  • Docker 安装 Apache(图文教程)
  • FPGA学习--verlog基础语法篇
  • 【C++】入门基础知识-1
  • Redis篇(环境搭建)
  • Vue 3 中 Props 的使用指南
  • MySQL原理、设计与应用全面解析
  • 前端和后端的相对路径和绝对路径
  • 自动化测试常用函数:弹窗、等待、导航、上传与参数设置