字符串计数匹配
2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷
华为OD机试双机位C卷真题目录点击查看: 【全网首发】2025华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)
题目描述
给你一个字符串str和整数k,返回满足以下条件的所有子字符串个数:
-
恰好包含k个字母。
-
数字0-9各出现至少一次。
输入描述
-
第一行字符串str(1≤ length ≤ 100000),仅包含数字和小写字母
-
第二行为整数k(0 ≤ k ≤100000 )
输出描述
输出一个整数,表示满足所有条件的子字符串的个数。
子字符串是字符串中连续的非空字符序列
示例1
输入
a0123456789aa
1
输出
2
说明
解题思路
问题理解
需要找出字符串中所有满足以下两个条件的子串数量:
-
恰好包含 k 个字母
-
数字 0-9 每个都至少出现一次 (意味着至少需要10个数字字符)
核心思路:双层枚举
1. 外层循环:枚举子串起点
从字符串的第一个位置开始,依次尝试每个可能的起始位置。
关键优化 :由于合法子串至少需要包含:
-
10 个数字(0-9 各一个)
-
k 个字母
所以子串最小长度为 10 + k ,起点最多只能到 n - 10 - k 的位置。
2. 内层循环:向右扩展子串
对于每个固定的起点,不断向右扩展终点,动态维护当前子串的状态:
起点 i 固定,终点 j 从 i 向右移动
[i -------- j] → [i ---------- j+1] → ...
3. 状态维护(增量更新)
每次扩展时,只需处理新加入的字符:
| 新字符类型 | 更新操作 |
|---|---|
| 字母 | 字母计数 +1 |
| 数字 | 对应数字的出现次数 +1;若该数字首次出现,则"不同数字种类数" +1 |
4. 剪枝优化
当字母数量超过 k 时,继续向右扩展只会让字母更多,永远无法满足"恰好 k 个字母"的条件。此时
订阅专栏 解锁全文
&spm=1001.2101.3001.5002&articleId=156577064&d=1&t=3&u=5f908d2a127349d3a2a37fa6b5cbcf92)
208

被折叠的 条评论
为什么被折叠?



