核心思路
要找最短的小写串 T,使得 T 不是 S 的子序列。若 S 里缺了某一种字母,则长度为 1 即可。若 26 种字母都出现过,任意长度为 1 的串都是子序列,答案至少为 2,并可以继续往下推。
从左到右扫描 S,用集合记录当前这一层已经见过的不同字母。每凑齐 26 种,就说明任意一个字符都能在这一层里被匹配掉,于是层数加一并清空集合。扫完后的层数加 1 就是答案。
正确性可以两边夹:设凑齐了 k 层。任意长度不超过 k 的串,第 i 个字符都可以在第 i 层里匹配,因而都是子序列。另一方面,记第 i 层最后补齐 26 种的那个字符为 ci,最后一层之后的后缀里缺的某个字母为 x,则 c1c2⋯ckx 无法按顺序匹配,故存在长度为 k+1 的非子序列。
短视频审核后台要把已过审成片的标题按发布时间依次拼接,得到小写字符串 S。S 的每一个子序列(含 S 本身与空串)都被视为已经占用的口令,不能再给新专题使用。
求最短的、不是 S 子序列的小写口令长度。
子序列:从原串中删除任意个(可以为零个)字符后,剩余字符保持相对顺序所形成的串。
一行,仅含小写字母的字符串 S(1≤∣S∣≤105)。
一行一个正整数,即最短未占用口令的长度。
输入
zyxwvutsrqponmlkjihgfedcbazyxwvutsrqponmlkjihgfedcba
输出
3
说明
S 由两段倒序的 26 个小写字母拼接而成。任意单个字母、任意长度为 2 的小写串都是 S 的子序列(前半段取第一个字符、后半段取第二个字符即可)。S 中字母 a 只出现两次,故 aaa 不是子序列,最短长度为 3。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册