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

devtools/2024/11/14 15:14:05/

题目:

题解

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.ppmy.cn/devtools/114894.html

相关文章

微信小程序06-综合项目点餐系统

零、文章目录 微信小程序06-综合项目点餐系统 1、项目开发准备 &#xff08;1&#xff09;开发背景 现如今&#xff0c;相比以服务员为中介完成点餐、送餐、买单的传统点餐方式&#xff0c;越来越多的餐厅开始使用微信小程序进行点餐。商家可以在微信小程序中添加点餐和收款…

将阮一峰老师的《ES6入门教程》的源码拷贝本地运行和发布

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 阮一峰老师的《ES6入门教程》应该是很多同学学习 ES6 知识的重要参考吧&#xff0c;应该也有很多同学在看该文档的时候&#xff0c;想知道这个教程的前端源码是怎么实现的&#xff0c;也可能有同学下载…

用SpringBoot进行通义千问接口调用同步方法和异步流式多轮回复方法

同步效果就不展示了,这里展示更常用的异步,多轮异步流式效果展示如下: 第一轮回答,此时没有会话id,需要雪花算法生成插入数据库 第二轮问题以及结果内容组合 1、同步版本环境准备以及代码 需要开通阿里大模型服务,如果没有开通服务,单独的去生成 key 是无效的。 阿里…

代码随想录刷题day32丨动态规划理论基础,509. 斐波那契数, 70. 爬楼梯, 746. 使用最小花费爬楼梯

代码随想录刷题day32丨动态规划理论基础&#xff0c;509. 斐波那契数&#xff0c; 70. 爬楼梯&#xff0c; 746. 使用最小花费爬楼梯 1.动态规划理论基础 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题…

企业如何使用数据分析管理系统

在数字化时代&#xff0c;数据成为企业发展新的增长方向&#xff0c;如何利用数据分析管理系统高效管理和运用这些数据&#xff0c;已成为企业决策者们亟待解决的关键所在。数聚股份将通过多年的实践经验来深入探讨企业如何通过数据分析管理系统实现智能决策&#xff0c;增强竞…

[网络][知识]TCP-IP各协议的RFC编号和RFC原始文档的获取地址

TCP/IP协议族包括很多个子协议,下面是TCP/IP 协议和支持服务所支持的 RFC。 RFC768 用户数据报协议 (UDP) RFC783 简单文件传输协议 (TFTP) RFC791 Internet 协议 (IP) RFC792 Internet 控制消息协议 (ICMP) RFC793 传输控制协议 (TCP) RFC816 故障隔离和恢复 RFC…

Python Flask网页开发基本框架

注&#xff1a;Flask详细学习请见Flask学习合集。 直接上代码: app.py from flask import Flaskapp Flask(__name__)app.route("/") def hello():return "Hello, World!"if __name__ "__init__":app.run(host "127.0.0.1", port…

LDD学习2--Scull(TODO)

《Linux Device Drivers》&#xff08;LDD&#xff09;书籍中的 scull&#xff08;Simple Character Utility for Loading Localities&#xff09;是一个用于演示 Linux 字符设备驱动程序编写的示例代码。它为理解 Linux 内核模块和字符设备驱动程序的编写提供了基础实践平台&a…