版本号校验 题解
题目为:点击跳转
题目概述
本题给定 nnn 个版本号字符串,要求判断它们是否全部合法,且按自定义顺序严格递增。版本号格式涵盖 Minecraft 历史上的多种命名方式,并包含若干愚人节特殊版本。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
核心难点
本题看似是一道简单的字符串模拟题,但存在以下几个容易忽视的关键点:
1. 版本号格式种类多:远古版、正式版、传统快照、预发布/候选版、语义化快照,每种格式的判定规则不同。
2. 语义化快照有版本号限制:-snapshot- 格式的版本号必须 ≥26.1\ge 26.1≥26.1。
3. 愚人节版本为白名单精确匹配,不经过任何格式检查。
4. 版本间的顺序规则不是纯字典序:远古版(以 a/b 开头)必须排在所有数字开头的版本之前。
5. 愚人节版本之间不要求递增:它们可以任意排列。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解题思路
第一步:合法性判断
将版本号分为几类,按优先级依次检查:
1. 愚人节版本(最高优先级)
使用 unordered_set 存储白名单,精确匹配。命中则直接返回合法,不进行任何后续格式检查。
2. 远古版(ALPHA / BETA)
格式:a1.2.3 或 b1.7.3。
判定方法:
* 正则匹配 ^[ab][0-9]+\.[0-9]+(\.[0-9]+)?$
* 去掉首字母后,按 . 分割,检查每段是否为合法数字(无前导零,纯数字,范围 [0,109][0, 10^9][0,109])
3. 正式版
格式:26.1 或 26.1.2。
判定方法:
* 正则匹配 ^[0-9]+\.[0-9]+(\.[0-9]+)?$
* 分割后检查每段数字合法性
4. 传统快照
格式:23w18a(两位数年份 + w + 两位数周数 + 小写字母)。
判定方法:
* 正则匹配 ^[0-9]{2}w[0-9]{2}[a-z]$
* 无需额外检查年份和周数范围(题目未要求,简化处理)
5. 预发布版 / 候选版
格式:26.2-pre1、26.2-pre-2、26.2-rc1、26.2-rc-2。
判定方法:
* 正则匹配 ^[0-9]+\.[0-9]+(\.[0-9]+)?-(pre|rc)-?[0-9]+$
* 提取版本号部分检查数字合法性
* 提取后缀中的数字部分检查合法性
6. 语义化快照
格式:26.1-snapshot-1 或 26.1.2-snapshot-1。
判定方法:
* 正则匹配 ^[0-9]+\.[0-9]+(\.[0-9]+)?-snapshot-[0-9]+$
* 提取版本号部分,检查主版本号和次版本号
* 限制条件:必须满足 主版本号>26主版本号 > 26主版本号>26 或 (主版本号=26(主版本号 = 26(主版本号=26 且 次版本号≥1)次版本号 \ge 1)次版本号≥1)
* 检查 snapshot- 后面的数字合法性
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二步:顺序判断
比较规则
* 远古版(以 a 或 b 开头)始终排在非远古版(数字开头)之前。
* 同类版本之间按字典序比较。
* 愚人节版本之间不要求递增,但愚人节版本与非愚人节版本之间仍需按上述规则比较。
实现方法
定义比较函数 less(a, b),判断 a 是否应排在 b 前面:
这是代码 点击跳转