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

华为OD机试真题:最左侧冗余覆盖子串(E卷、C++)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集

在这里插入图片描述

题目描述

给定两个字符串s1和s2和正整数K,其中s1长度为n1,s2长度为n2,在s2中选一个子串,满足:

  • 该子串长度为n1+k
  • 该子串中包含s1中全部字母,
  • 该子串每个字母出现次数不小于s1中对应的字母,

我们称s2以长度k冗余覆盖s1,给定s1,s2,k,求最左侧的s2以长度k冗余覆盖s1的子串的首个元素的下标,如果没有返回**-1**。

输入描述

输入三行,第一行为s1;

第二行为s2;

第三行为k;

s1和s2只包含小写字母

输出描述

最左侧的s2以长度k冗余覆盖s1的子串首个元素下标,如果没有返回**-1。**

示例1

输入:
ab
aabcd
1

输出:
0

说明:
子串aab和abc符合要求,由于aab在abc的左侧,因此输出aab的下标:0

示例2

输入:
abc
dfs
10

输出:
-1

说明:
s2无法覆盖s1,输出 -1

C++

#include <bits/stdc++.h>

using namespace std;

int main() {
    string s1, s2;
    int k;
    cin >> s1;
    cin >> s2;
    cin >> k;
    int n1 = s1.size(), n2 = s2.size();

    // 记录 s1 中每个字符出现的次数
    int cnt1[26] = {0};
    for (char c: s1) cnt1[c - 'a']++;

    // 用于记录s2滑动窗口上的子字符串中的每个字符出现的次数
    int cnt2[26] = {0};
    int l = 0, r = 0;
    while (r < n2) {
        cnt2[s2[r++] - 'a']++;
        // 子串长度不足 n1 + k 时继续扩大窗口
        if (r < n1 + k) continue;

        // 使保持窗口大小为 n1 + k
        if (r - l > n1 + k) cnt2[s2[l++]]--;

        // 判断当前子字符串 s[l:r] 是否冗余覆盖 s1 中所有字母
        bool cover = true;
        for (int i = 0; i < 26; i++) {
            if (cnt1[i] > cnt2[i]) {
                cover = false;
                break;
            }
        }

        // 找到冗余覆盖的子字符串
        if (cover) {
            cout << l << endl;
            return 0;
        }
    }

    // 没有找到符合要求的子字符串
    cout << -1 << endl;

    return 0;
}

题目分析

这个问题要求我们找到一个子串,使得该子串长度为 n1 + k,并且能够冗余覆盖 s1 中的所有字母,即该子串中每个字母的出现次数至少是 s1 中相应字母的出现次数。要求我们找到最左边的符合条件的子串,并输出其起始位置。

解题思路

这个问题本质上是一个滑动窗口问题,我们可以通过维护一个窗口来扫描字符串 s2。具体步骤如下:

  1. 字符频率统计:

    • 先统计字符串 s1 中每个字符的出现次数,记录在数组 cnt1 中。
    • 然后在 s2 中维护一个滑动窗口,该窗口的大小是 n1 + k,并记录该窗口中每个字符的出现次数,保存在 cnt2 数组中。
  2. 滑动窗口:

    • s2 的第一个字符开始,窗口的右边界逐渐向右扩展,直到窗口的大小为 n1 + k
    • 每次扩展窗口时,更新 cnt2 数组,记录当前窗口中每个字符的出现次数。
    • 如果窗口的大小超过了 n1 + k,则左边界向右移动,保持窗口大小不变,并更新 cnt2 数组。
  3. 判断冗余覆盖:

    • 每次更新窗口时,我们检查当前窗口中的字符频率是否能够满足冗余覆盖 s1 的条件。具体来说,检查 cnt2 中每个字符的数量是否都大于等于 cnt1 中相应字符的数量。
  4. 结果输出:

    • 如果找到了符合条件的子串,输出其左边界索引。
    • 如果扫描完整个 s2 后没有找到符合条件的子串,输出 -1

时间复杂度分析

  • 滑动窗口的右边界 r 会遍历整个 s2 字符串,因此时间复杂度是 O(n2),其中 n2s2 的长度。
  • 对每个滑动窗口,检查是否满足冗余覆盖需要遍历 26 个字母,因此检查过程的时间复杂度是 O(26) ≈ O(1)。
  • 总的时间复杂度是 O(n2)。

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

相关文章:

  • Kafka面试题汇总
  • 大模型面试基础问题
  • Open WebUI本地部署教程
  • 创建索引时,ES,分片和副本定义原则
  • w228高校教师电子名片系统的设计与实现
  • 我写了一个程序:禁止用户Drop数据库 | 禁止Drop database包括用户自身建的库也无权限删除
  • 2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码
  • 2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题6)-网络部分解析-附详细代码
  • 在 WPF 项目中集成 Hangfire
  • 使用AWS服务Amazon Bedrock构建大模型应用
  • CSS 使用white-space属性换行
  • 检测服务端口是否开放的常用方法
  • mysql的可重复读隔离级别解决了不可重复读和大部分幻读
  • 在 JavaScript 中,[](空数组)不是假值,它是“真值”(truthy)
  • 修改与 Git 相关的邮箱
  • 各种以太坊Rollup技术
  • 微信小程序-二维码绘制
  • PHP-create_function
  • 力扣3464. 正方形上的点之间的最大距离
  • 【jira】用到几张表
  • 做团购网站需要什么资质/网页广告调词平台多少钱
  • 泰安公司做网站/电商培训班一般多少钱一个月
  • 做网站 广州/最吸引人的引流话术
  • 男生可以做网站编辑工作吗/谷歌 翻墙入口
  • 哪个网站建设公司/网络推广营销方案100例
  • 广西流行病毒最新消息新闻/沈阳seo顾问